ZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L0JVSUxESU5HLnR4dCBiL2FwYWNoZS1taW1lNGotMC42L0JVSUxESU5HLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDFjM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvQlVJTERJTkcudHh0CkBAIC0wLDAgKzEsNDQgQEAKK0J1aWxkaW5nIEFwYWNoZSBNaW1lNGogDQorPT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKygxKSBSZXF1aXNpdGVzDQorLS0tLS0tLS0tLS0tLS0NCitNaW1lNGogdXRpbGl6ZXMgTWF2ZW4gMiBhcyBhIGRpc3RyaWJ1dGlvbiBtYW5hZ2VtZW50IGFuZCBwYWNrYWdpbmcgdG9vbC4gVmVyc2lvbiAyLjAuNyANCitvciBhYm92ZSBpcyByZWNvbW1lbmRlZC4gDQorDQorSkRLIDEuNSBvciBhYm92ZSBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBjb21waWxlIE1pbWU0ai4NCisNCitNYXZlbiBpbnN0YWxsYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5zdHJ1Y3Rpb25zIGNhbiBiZSBmb3VuZCBoZXJlOg0KKw0KK2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3J1bi1tYXZlbi9pbmRleC5odG1sDQorDQorKDIpIEV4ZWN1dGluZyB0ZXN0IGNhc2VzDQorDQorRXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgaW4gb3JkZXIgdG8gY29tcGlsZSBhbmQgdGVzdCB0aGUgY29tcG9uZW50czoNCisNCittdm4gdGVzdA0KKw0KKygzKSBCdWlsZGluZyBwYWNrYWdlcyANCisNCitFeGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpbiBvcmRlciB0byBidWlsZCBKQVIgYW5kIGFzc2VtYmx5IHBhY2thZ2VzOg0KKw0KK212biBwYWNrYWdlDQorDQorT25lIGNhbiBhbHNvIHV0aWxpemUgdGhlICdsb2NhbCcgcHJvZmlsZSB0byBidWlsZCBKQVIgYW5kIGFzc2VtYmx5IHBhY2thZ2VzDQoraW4gdGhlIG9mZi1saW5lIG1vZGU6DQorDQorbXZuIC1QbG9jYWwgcGFja2FnZQ0KKw0KK1JlZGlzdHJpYnV0YWJsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIHRhcmdldCBmb2xkZXIuIA0KKw0KKyg0KSBCdWlsZGluZyBkb2N1bWVudGF0aW9uIA0KKw0KK0V4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kIGluIG9yZGVyIHRvIGdlbmVyYXRlIGphdmFkb2M6DQorDQorbXZuIGphdmFkb2M6amF2YWRvYw0KKw0KKyg1KSBCdWlsZGluZyBwcm9qZWN0IHdlYiBzaXRlIA0KKw0KK0V4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBwcm9qZWN0IHdlYiBzaXRlOg0KKw0KK212biBzaXRlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvTElDRU5TRS50eHQgYi9hcGFjaGUtbWltZTRqLTAuNi9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmJmM2ExCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvTElDRU5TRS50eHQKQEAgLTAsMCArMSw0NTEgQEAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworICAgCisgICAKKyAgIAorCisgICBUSElTIFBST0RVQ1QgQUxTTyBJTkNMVURFUyBUSElSRCBQQVJUWSBTT0ZUV0FSRSBSRURJU1RSSUJVVEVEIFVOREVSIFRIRQorICAgRk9MTE9XSU5HIExJQ0VOU0VTOgorCisgICBKVW5pdCwgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICAoanVuaXQtMy44LjEuamFyKQorICAgICBodHRwOi8vanVuaXQub3JnCisJCQorCQlUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgQ09NTU9OIFBVQkxJQworCQlMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0KKwkJQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKwkJCisJCTEuIERFRklOSVRJT05TCisJCQorCQkiQ29udHJpYnV0aW9uIiBtZWFuczoKKwkJCisJCWEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZAorCQlkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKwkJCisJCWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKwkJCisJCWkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorCQkKKwkJaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKwkJCisJCXdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUKKwkJZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhCisJCUNvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKKwkJYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvCisJCXRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KKwkJY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKKwkJZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKwkJCisJCSJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKwkJCisJCSJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUKKwkJbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4KKwkJY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKwkJCisJCSJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCisJCQorCQkiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LAorCQlpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKwkJCisJCTIuIEdSQU5UIE9GIFJJR0hUUworCQkKKwkJYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cworCQlSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bworCQlyZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwKKwkJZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2gKKwkJZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uCisJCQorCQliKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCisJCVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkCisJCVBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKKwkJQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uCisJCVRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZQorCQlQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorCQlhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlCisJCUxpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucworCQl3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisJCQorCQljKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMKKwkJdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55CisJCUNvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwKKwkJcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8KKwkJUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZgorCQlpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUKKwkJcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZQorCQlyZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuCisJCUZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0bworCQlkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZQorCQliZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCQkKKwkJZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudAorCQljb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldAorCQlmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKwkJCisJCTMuIFJFUVVJUkVNRU5UUworCQkKKwkJQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMKKwkJb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCQkKKwkJYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCQkKKwkJYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgorCQkKKwkJaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAorCQljb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZAorCQlub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorCQlmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKwkJCisJCWlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvcgorCQlkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbAorCQlkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKwkJCisJCWlpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQKKwkJYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kCisJCQorCQlpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2gKKwkJQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IKKwkJdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKwkJCisJCVdoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKwkJCisJCWEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCQkKKwkJYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCisJCQorCQlDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlCisJCVByb2dyYW0uCisJCQorCQlFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmCisJCWFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlCisJCW9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KKwkJCisJCTQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisJCQorCQlDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoCisJCXJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcworCQlpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobworCQlpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIKKwkJd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZgorCQlhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoCisJCUNvbnRyaWJ1dG9yICgiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkKKwkJZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcworCQlhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsCisJCWFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZQorCQlleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KKwkJY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKKwkJb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCisJCXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgorCQl0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKKwkJQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8KKwkJY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55CisJCXJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUgaW4KKwkJYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCQkKKwkJRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorCQlvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0CisJCUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCisJCXJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2gKKwkJQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZQorCQlDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlcgorCQlDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0CisJCXJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsCisJCUNvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisJCQorCQk1LiBOTyBXQVJSQU5UWQorCQkKKwkJRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOCisJCSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgorCQlJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorCQlOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2gKKwkJUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKKwkJZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mCisJCXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mCisJCXByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLAorCQlwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKwkJCisJCTYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisJCQorCQlFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWQorCQlDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKwkJU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVAorCQlQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorCQlTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorCQlPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMKKwkJR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCQkKKwkJNy4gR0VORVJBTAorCQkKKwkJSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZQorCQlsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlCisJCXRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKKwkJcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoCisJCXByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisJCQorCQlJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGEgQ29udHJpYnV0b3Igd2l0aCByZXNwZWN0IHRvCisJCWEgcGF0ZW50IGFwcGxpY2FibGUgdG8gc29mdHdhcmUgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhCisJCWxhd3N1aXQpLCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgZ3JhbnRlZCBieSB0aGF0IENvbnRyaWJ1dG9yIHRvIHN1Y2ggUmVjaXBpZW50CisJCXVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIEluCisJCWFkZGl0aW9uLCBpZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKwkJKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0KKwkJaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpCisJCWluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyCisJCVNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCQkKKwkJQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8KKwkJY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzCisJCW5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2YKKwkJc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwKKwkJUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzCisJCXJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50CisJCWFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kCisJCXN1cnZpdmUuCisJCQorCQlFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbgorCQlvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlCisJCW1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvCisJCXB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4KKwkJTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LgorCQlJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIElCTSBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZQorCQlhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCisJCUFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKKwkJQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQKKwkJdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50CisJCWlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMKKwkJQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucworCQkyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZQorCQlpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCisJCWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKKwkJZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCQkKKwkJVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUKKwkJaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcworCQlBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIKKwkJYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4KKwkJYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgorCQkgCisJCSAKKyAgICBCbmQsIEJ1bmRsZSBUb29sIGh0dHA6Ly93d3cuYXF1dGUuYml6L0NvZGUvQm5kLCBUaGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisJQUxMIE9USEVSUyBKQVJTLCBCWSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTgorCUFMTCBPRiBUSEVTRSBBUkUgTElDRU5TRUQgVU5ERVIgVGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBFWENFUFQ6CisJCisJQXBhY2hlIENvbW1vbnMgTG9nZ2luZywgCisJICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSAoY29tbW9ucy1sb2dnaW5nLTEuMS4xLmphcikKKwkgIAorCQkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQorCQkKKwkJIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorCQkgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisJCSBhcmUgbWV0OgorCQkKKwkJIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisJCSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisJCQorCQkgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKwkJICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorCQkgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorCQkgICAgZGlzdHJpYnV0aW9uLgorCQkKKwkJIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAorCQkgICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKwkJICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorCQkgICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCisJCSAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisJCSAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgorCQkKKwkJIDQuIFRoZSBuYW1lcyAiQXBhY2hlIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0CisJCSAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKwkJICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgorCQkgICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCisJCQorCQkgNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCisJCSAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKwkJICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCQkKKwkJIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKKwkJIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCisJCSBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorCQkgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgorCQkgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorCQkgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorCQkgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgorCQkgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorCQkgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCisJCSBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKKwkJIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorCQkgU1VDSCBEQU1BR0UuCisJCQorCisJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvTk9USUNFLnR4dCBiL2FwYWNoZS1taW1lNGotMC42L05PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyNWRiMAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L05PVElDRS50eHQKQEAgLTAsMCArMSwxNCBAQAorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKyAgID09ICAgICAgTk9USUNFIGZpbGUgZm9yIHVzZSB3aXRoIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAsICAgICAgPT0NCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorICAgDQorICAgQXBhY2hlIEpBTUVTIE1pbWU0ag0KKyAgIENvcHlyaWdodCAyMDA0LTIwMDggVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQorICAgCisgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0DQorICAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4NCisgICANCisgICBUaGlzIHByb2R1Y3QgbWF5IGluY2x1ZGUvdXNlIHNvZnR3YXJlLCBKVW5pdCAoaHR0cDovL3d3dy5qdW5pdC5vcmcvKSwNCisgICBkZXZlbG9wZWQgYnkgS2VudCBCZWNrLCBFcmljaCBHYW1tYSwgYW5kIERhdmlkIFNhZmYNCisgICBMaWNlbnNlOiBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjANCisgICAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9jcGwucGhwKQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L1JFTEVBU0VfTk9URVMudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvUkVMRUFTRV9OT1RFUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5MmMxOAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L1JFTEVBU0VfTk9URVMudHh0CkBAIC0wLDAgKzEsMTE3IEBACitSZWxlYXNlIDAuNgorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNaW1lNEogaXMgYSBmbGV4aWJsZSBNSU1FIHBhcnNpbmcgbGlicmFyeSB3cml0dGVuIGluIEphdmEuIFNBWCwgRE9NIGFuZCBwdWxsIHBhcnNpbmcgc3R5bGVzIGFyZSAKK3N1cHBvcnRlZC4KKworVGhlIDAuNiByZWxlYXNlIGJyaW5ncyBhbm90aGVyIHJvdW5kIG9mIEFQSSBlbmhhbmNlbWVudHMgYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMuIFRoZXJlIGhhcyAKK2JlZW4gYSBudW1iZXIgb2Ygbm90YWJsZSBpbXByb3ZlbWVudHMgaW4gdGhlIERPTSBzdXBwb3J0LiBNSU1FIHN0cmVhbSBwYXJzZXIgaXMgZXhwZWN0ZWQgdG8gYmUKKzUwJSBmYXN0ZXIgd2hlbiBsaW5lIGNvdW50aW5nIGlzIGRpc2FibGVkLiBQbGVhc2UgYWxzbyBub3RlIHRoYXQgYXMgb2YgdGhpcyByZWxlYXNlIE1pbWU0aiAKK3JlcXVpcmVzIGEgSmF2YSAxLjUgY29tcGF0aWJsZSBydW50aW1lLgorCitOb3RlcworLS0tLS0KKworICogTWltZTRqIEFQSSBpcyBzdGlsbCBjb25zaWRlcmVkIHVuc3RhYmxlIGFuZCBpcyBsaWtlbHkgdG8gY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcworICogVGhlIERPTSBBUEkgaGFzIGJlZW4gbm93IGJlZW4gY29tcHJlaGVuc2l2ZWx5IHJlZmFjdG9yZWQgYW5kIHRoZSBrbm93biBsaW1pdGF0aW9ucyAKKyAgIGFkZHJlc3NlZC4gUGxlYXNlIHJlcG9ydCBhbnkgcmVtYWluaW5nIGlzc3VlcyB0byAKKyAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTUlNRTRKLgorICogU29tZSBsb3cgbGV2ZWwgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgb25seSBpbiB0aGUgcHVsbCBwYXJzZXIgKHJlY29tbWVuZGVkIGZvcgorICAgYWR2YW5jZWQgdXNlcnMpCisgKiAwLjYgY29udGFpbnMgYSBtaXh0dXJlIG9mIGFwcHJvYWNoZXMgdG8gdGhlIHBhcnNpbmcgb2YgYWR2YW5jZWQgTUlNRSBmaWVsZCB0eXBlcy4gCisgICBMaW1pdGF0aW9ucyBhcmUga25vd24gd2l0aCB0aGVzZSBhcHByb2FjaGVzIHdpdGggc29tZSByZWxhdGl2ZWx5IHVuY29tbW9uIHVzZSBjYXNlcy4gCisgICBBIGNvbnNpc3RlbnQgYW5kIGNvbXByZWhlbnNpdmUgcmV3cml0ZSBpcyBwbGFubmVkIGZvciAwLjcgd2hpY2ggc2hvdWxkIGNvbnNvbGlkYXRlIAorICAgYW5kIGFkZHJlc3MgdGhlc2UuCisgKiBUaGUgZm9ybWVyIGludGVyZmFjZXMgVGV4dEJvZHkgYW5kIEJpbmFyeUJvZHkgaGF2ZSBiZWVuIGNoYW5nZWQgaW50byBhYnN0cmFjdCBzdWJjbGFzc2VzCisgICBvZiBjbGFzcyBTaW5nbGVCb2R5LiBDb2RlIHRoYXQgaW1wbGVtZW50cyB0aGVzZSBpbnRlcmZhY2VzIGhhcyB0byBiZSBjaGFuZ2VkIGFjY29yZGluZ2x5LgorICAgW2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTUlNRTRKLTExMV0KKyAqIEEgZGVkaWNhdGVkIGNsYXNzIGZvciB3cml0aW5nIGEgbWVzc2FnZSBoYXMgYmVlbiBpbnRyb2R1Y2VkLiBDbGFzcyBNZXNzYWdlV3JpdGVyIGhhcyBub3cKKyAgIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBCb2R5LndyaXRlVG8oT3V0cHV0U3RyZWFtLCBpbnQpLiBBIHNob3J0LWN1dCBtZXRob2QKKyAgIE1lc3NhZ2Uud3JpdGVUbyhPdXRwdXRTdHJlYW0pIHdpdGhvdXQgYSBtb2RlIHBhcmFtZXRlciBpcyBhbHNvIGF2YWlsYWJsZS4KKyAgIFtodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL01JTUU0Si0xMTBdCisgKiBDbGFzcyBOYW1lZE1haWxib3ggaGFzIGJlZW4gcmVtb3ZlZC4gQ2xhc3MgTWFpbGJveCBub3cgaGFzIGFuIGFkZGl0aW9uYWwgbmFtZSBwcm9wZXJ0eS4KKyAgIFtodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL01JTUU0Si0xMDddCisgKiBDbGFzcyBNZXNzYWdlVXRpbHMgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIG1ldGhvZHMgYW5kIGNvbnN0YW50cyBjYW4gbm93IGJlIGZvdW5kIGluIGNsYXNzCisgICBDaGFyc2V0VXRpbCBpbiB0aGUgc2FtZSBwYWNrYWdlLgorICAgW2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTUlNRTRKLTEwNl0KKyAqIFBhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVjb2RlciBoYXMgYmVlbiByZW5hbWVkIGluIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLgorICAgW2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTUlNRTRKLTEwNV0KKyAqIENsYXNzIEFic3RyYWN0Qm9keSBoYXMgYmVlbiBzdXBlcnNlZGVkIGJ5IFNpbmdsZUJvZHkuIEFic3RyYWN0Qm9keSBoYXMgYmVlbiByZW1vdmVkLgorICogQm9keUZhY3RvcnkgaW50cm9kdWNlZCBhbGxvd2luZyBtb3JlIGZsZXhpYmxlIHN0b3JhZ2UgZm9yIE1lc3NhZ2UgcGFydHMuIFRlbXBGaWxlVGV4dEJvZHkKKyAgIGFuZCBUZW1wRmlsZUJpbmFyeUJvZHkgcmVtb3ZlZC4KKyAgIFtodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL01JTUU0Si04N10KKyAqIE1pbWU0aiBub3cgaGFzIGEgbW9yZSBmbGV4aWJsZSBtZWNoYW5pc20gZm9yIHN0b3JpbmcgbWVzc2FnZSBib2RpZXMuIENsYXNzIFRlbXBTdG9yYWdlCisgICBoYXMgYmVlbiBzdXBlcnNlZGVkIGJ5IFN0b3JhZ2VQcm92aWRlciBpbiBwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuCisgICBUaGUgY2xhc3NlcyBUZW1wU3RvcmFnZSwgVGVtcFBhdGgsIFRlbXBGaWxlIGFuZCBTaW1wbGVUZW1wU3RvcmFnZSBoYXZlIGJlZW4gcmVtb3ZlZC4KKyAgIFtodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL01JTUU0Si04M10KKyAqIFRlbXBvcmFyeSB0ZXh0IGJvZHkgc3RvcmFnZSBmb3IgTWVzc2FnZSBwYXJ0cyBub3cgZGVmYXVsdHMgdG8gVVMtQVNDSUkgKHdhcyBJU08tODg1OS0xKQorCitEZXRhaWxlZCBjaGFuZ2UgbG9nIGNhbiBiZSBmb3VuZCBoZXJlOgorCitodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9zZWN1cmUvUmVsZWFzZU5vdGUuanNwYT9wcm9qZWN0SWQ9MTIzMTA1MjEmc3R5bGVOYW1lPUh0bWwmdmVyc2lvbj0xMjMxMzQzNAorCisKK1JlbGVhc2UgMC41CistLS0tLS0tLS0tLS0tLS0tLS0tCisKK01pbWU0SiBpcyBhIGZsZXhpYmxlIE1JTUUgcGFyc2luZyBsaWJyYXJ5IHdyaXR0ZW4gaW4gSmF2YS4gU0FYLCBET00gYW5kIHB1bGwgcGFyc2luZworc3R5bGVzIGFyZSBzdXBwb3J0ZWQuCisKKworVGhlIDAuNSByZWxlYXNlIGFkZHJlc3NlcyBhIG51bWJlciBvZiBpbXBvcnRhbnQgaXNzdWVzIGRpc2NvdmVyZWQgc2luY2UgMC40LiBJbiAKK3BhcnRpY3VsYXIsIGl0IGltcHJvdmVzIE1pbWU0aiBhYmlsaXR5IHRvIGRlYWwgd2l0aCBtYWxmb3JtZWQgZGF0YSBzdHJlYW1zIGluY2x1ZGluZyAKK3Rob3NlIGludGVudGlvbmFsbHkgY3JhZnRlZCB0byBjYXVzZSBleGNlc3NpdmUgQ1BVIGFuZCBtZW1vcnkgdXRpbGl6YXRpb24gdGhhdCBjYW4gCitsZWFkIHRvIERvUyBjb25kaXRpb25zLgorCitUaGlzIHJlbGVhc2UgYWxzbyBmaXhlcyBhIHNlcmlvdXMgYnVnIHRoYXQgY2FuIHByZXZlbnQgTWltZTRqIGZyb20gY29ycmVjdGx5IAorcHJvY2Vzc2luZyBiaW5hcnkgY29udGVudC4KKworRGV0YWlsZWQgY2hhbmdlIGxvZyBjYW4gYmUgZm91bmQgaGVyZToKKworaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9SZWxlYXNlTm90ZS5qc3BhP3Byb2plY3RJZD0xMjMxMDUyMSZzdHlsZU5hbWU9SHRtbCZ2ZXJzaW9uPTEyMzEzMTc4CisKK05vdGVzCistLS0tLQorICogTWltZTRqIEFQSSBpcyBzdGlsbCBjb25zaWRlcmVkIHVuc3RhYmxlIGFuZCBpcyBsaWtlbHkgdG8gY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcworICogRE9NIHN1cHBvcnQgaGFzIGtub3duIGxpbWl0YXRpb25zIGFuZCBzb21lIHJvdW5kdHJpcCBpc3N1ZXMgcmVtYWluIHRvIGJlIHJlc29sdmVkCisgKiBTb21lIGxvdyBsZXZlbCBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBvbmx5IGluIHRoZSBwdWxsIHBhcnNlciAocmVjb21tZW5kZWQgZm9yIAorICAgYWR2YW5jZWQgdXNlcnMpCisKKworCitSZWxlYXNlIDAuNAorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNaW1lNEogaXMgYSBmbGV4aWJsZSBNSU1FIHBhcnNpbmcgbGlicmFyeSB3cml0dGVuIGluIEphdmEuIFNBWCwgRE9NIGFuZCBwdWxsIHBhcnNpbmcKK3N0eWxlcyBhcmUgc3VwcG9ydGVkLgorCitUaGUgMC40IHJlbGVhc2UgYnJpbmdzIGEgbnVtYmVyIG9mIHNpZ25pZmljYW50IGltcHJvdmVtZW50cyBpbiB0ZXJtcyBvZiAKK3N1cHBvcnRlZCBjYXBhYmlsaXRpZXMsIGZsZXhpYmlsaXR5IGFuZCBwZXJmb3JtYW5jZTogCisKKyogUmV2aXNlZCBhbmQgaW1wcm92ZWQgcHVibGljIEFQSSB3aXRoIHN1cHBvcnQgZm9yIHB1bGwgcGFyc2luZworCisqIFN1cHBvcnQgZm9yIHBhcnNpbmcgb2YgJ2hlYWRsZXNzJyBtZXNzYWdlcyB0cmFuc21pdHRlZCB1c2luZyBub24gU01UUCAKKyAgdHJhbnNwb3J0cyBzdWNoIGFzIEhUVFAKKworKiBSZWR1Y2VkIGV4dGVybmFsIGRlcGVuZGVuY2llcy4gTWltZTRqIGlzIG5vIGxvbmdlciBkaXJlY3RseSBkZXBlbmRlbnQgb24gbG9nNGogCisgIGFuZCBjb21tb25zLWlvCisKKyogSW1wcm92ZWQgcGFyc2luZyBwZXJmb3JtYW5jZSAodXAgdG8gMTB4IGZvciBsYXJnZSBtZXNzYWdlcykKKworKiBNb3JlIGNvbXByZWhlbnNpdmUgaGVhZGVyIHBhcnNpbmcgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIFJGQzE4NjQsIFJGQzIwNDUsIAorICBSRkMyMTgzLCBSRkMyNTU3IGFuZCBSRkMzMDY2CisKKyogUmV2aXNlZCBwYWNrYWdpbmcgYW5kIGV4Y2VwdGlvbiBoaWVyYXJjaHkuIE1pbWVFeGNlcHRpb24gbm93IGV4dGVuZHMKKyAgSU9FeGNlcHRpb24uCisKK0RldGFpbGVkIGNoYW5nZSBsb2cgY2FuIGJlIGZvdW5kIGhlcmU6CisKK2h0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9SZWxlYXNlTm90ZS5qc3BhP3Byb2plY3RJZD0xMjMxMDUyMSZzdHlsZU5hbWU9SHRtbCZ2ZXJzaW9uPTEyMzEyNDgzCisKK05vdGVzCistLS0tLQorICogMC40IGNvbnRhaW5zIG51bWVyb3VzIEFQSSBpbXByb3ZlbWVudHMgYW5kIGlzIG5vdCBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIDAuMworICogTWltZTRqIEFQSSBpcyBzdGlsbCBjb25zaWRlcmVkIHVuc3RhYmxlIGFuZCBpcyBsaWtlbHkgdG8gY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcworICogRE9NIHN1cHBvcnQgaGFzIGtub3duIGxpbWl0YXRpb25zIGFuZCBzb21lIHJvdW5kdHJpcCBpc3N1ZXMgcmVtYWluIHRvIGJlIHJlc29sdmVkCisgKiBTb21lIGxvdyBsZXZlbCBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBvbmx5IGluIHRoZSBwdWxsIHBhcnNlciAocmVjb21tZW5kZWQgZm9yIAorICAgYWR2YW5jZWQgdXNlcnMpCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9iZW5jaG1hcmtzL3Jlc291cmNlcy9sb25nLW11bHRpcGFydC5tc2cgYi9hcGFjaGUtbWltZTRqLTAuNi9iZW5jaG1hcmtzL3Jlc291cmNlcy9sb25nLW11bHRpcGFydC5tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0ZDkzZQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L2JlbmNobWFya3MvcmVzb3VyY2VzL2xvbmctbXVsdGlwYXJ0Lm1zZwpAQCAtMCwwICsxLDY4NCBAQAorRGF0ZTogRnJpLCAyNyBBcHIgMjAwNyAxNjowODoyMyArMDIwMAorRnJvbTogRm9vIEJhciA8YmFyQGV4YW1wbGUuY29tPgorTUlNRS1WZXJzaW9uOiAxLjAKK1RvOiAgZm9vQGV4YW1wbGUuY29tCitTdWJqZWN0OiBUaGlzIGlzIGEgcmF0aGVyIGxvbmcgbXVsdGlwYXJ0IG1lc3NhZ2UuCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTA5MDQwNDA4MDQwNTA4MDEwODAwMDkwOSIKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKy0tLS0tLS0tLS0tLS0tMDkwNDA0MDgwNDA1MDgwMTA4MDAwOTA5CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTUKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorLS0tLS0tLS0tLS0tLS0wOTA0MDQwODA0MDUwODAxMDgwMDA5MDkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCisyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyCistLS0tLS0tLS0tLS0tLTA5MDQwNDA4MDQwNTA4MDEwODAwMDkwOQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMKKy0tLS0tLS0tLS0tLS0tMDkwNDA0MDgwNDA1MDgwMTA4MDAwOTA5CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTUKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NAorLS0tLS0tLS0tLS0tLS0wOTA0MDQwODA0MDUwODAxMDgwMDA5MDkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1Cis1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1CistLS0tLS0tLS0tLS0tLTA5MDQwNDA4MDQwNTA4MDEwODAwMDkwOS0tCisKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L2JlbmNobWFya3Mvc3JjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL0Jhc2U2NElucHV0U3RyZWFtQmVuY2guamF2YSBiL2FwYWNoZS1taW1lNGotMC42L2JlbmNobWFya3Mvc3JjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL0Jhc2U2NElucHV0U3RyZWFtQmVuY2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzAzZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvYmVuY2htYXJrcy9zcmMvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovQmFzZTY0SW5wdXRTdHJlYW1CZW5jaC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQuTnVsbE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5CYXNlNjRJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5Db2RlY1V0aWw7CisKK3B1YmxpYyBjbGFzcyBCYXNlNjRJbnB1dFN0cmVhbUJlbmNoIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IGluaXREYXRhKDIgKiAxMDI0ICogMTAyNCk7CisgICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gZW5jb2RlKGRhdGEpOworCisgICAgICAgIC8vIGRlY29kZXIgdGVzdCB0byBtYWtlIHN1cmUgZXZlcnl0aGluZyBpcyBva2F5CisKKyAgICAgICAgdGVzdERlY29kZShkYXRhLCBlbmNvZGVkKTsKKworICAgICAgICAvLyB3YXJtdXAKKworICAgICAgICBPdXRwdXRTdHJlYW0gbnVsbE91dCA9IG5ldyBOdWxsT3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGVkID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kZWQpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQmFzZTY0SW5wdXRTdHJlYW0oZWQpOworICAgICAgICAgICAgQ29kZWNVdGlsLmNvcHkoaW4sIG51bGxPdXQpOworICAgICAgICB9CisgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworCisgICAgICAgIC8vIHRlc3QKKworICAgICAgICBsb25nIHQwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcGV0aXRpb25zID0gNTA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZXRpdGlvbnM7IGkrKykgeworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZWQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW5jb2RlZCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCYXNlNjRJbnB1dFN0cmVhbShlZCk7CisgICAgICAgICAgICBDb2RlY1V0aWwuY29weShpbiwgbnVsbE91dCk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGR0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0MDsKKyAgICAgICAgbG9uZyB0b3RhbEJ5dGVzID0gZGF0YS5sZW5ndGggKiAobG9uZykgcmVwZXRpdGlvbnM7CisKKyAgICAgICAgZG91YmxlIG1iUGVyU2VjID0gKHRvdGFsQnl0ZXMgLyAxMDI0LjAgLyAxMDI0KSAvIChkdCAvIDEwMDAuMCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGR0ICsgIiBtcyIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odG90YWxCeXRlcyArICIgYnl0ZXMiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1iUGVyU2VjICsgIiBtYi9zZWMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gaW5pdERhdGEoaW50IHNpemUpIHsKKyAgICAgICAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oc2l6ZSk7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMoZGF0YSk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBlbmNvZGUoYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBDb2RlY1V0aWwuZW5jb2RlQmFzZTY0KGluLCBvdXQpOworICAgICAgICByZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0RGVjb2RlKGJ5dGVbXSBkYXRhLCBmaW5hbCBieXRlW10gZW5jb2RlZCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGVkID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVuY29kZWQpOworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCYXNlNjRJbnB1dFN0cmVhbShlZCk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVjVXRpbC5jb3B5KGluLCBvdXQpOworCisgICAgICAgIGNvbXBhcmUoZGF0YSwgb3V0LnRvQnl0ZUFycmF5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29tcGFyZShieXRlW10gZXhwZWN0ZWQsIGJ5dGVbXSBhY3R1YWwpIHsKKyAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSBhY3R1YWwubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJsZW5ndGg6ICIgKyBleHBlY3RlZC5sZW5ndGggKyAiLCAiCisgICAgICAgICAgICAgICAgICAgICsgYWN0dWFsLmxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIGlmIChleHBlY3RlZFtpXSAhPSBhY3R1YWxbaV0pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJ2YWx1ZSBAICIgKyBpKTsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9iZW5jaG1hcmtzL3NyYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9CYXNlNjRPdXRwdXRTdHJlYW1CZW5jaC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvYmVuY2htYXJrcy9zcmMvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovQmFzZTY0T3V0cHV0U3RyZWFtQmVuY2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzVlNzZhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvYmVuY2htYXJrcy9zcmMvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovQmFzZTY0T3V0cHV0U3RyZWFtQmVuY2guamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQuTnVsbE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5CYXNlNjRPdXRwdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBCYXNlNjRPdXRwdXRTdHJlYW1CZW5jaCB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBpbml0RGF0YSgxMDI0KTsKKworICAgICAgICBPdXRwdXRTdHJlYW0gbnVsbE91dCA9IG5ldyBOdWxsT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIEJhc2U2NE91dHB1dFN0cmVhbSBiYXNlNjRPdXQgPSBuZXcgQmFzZTY0T3V0cHV0U3RyZWFtKG51bGxPdXQpOworCisgICAgICAgIC8vIHdhcm11cAorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwMDsgaSsrKSB7CisgICAgICAgICAgICBiYXNlNjRPdXQud3JpdGUoZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisKKyAgICAgICAgLy8gdGVzdAorCisgICAgICAgIGxvbmcgdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVwZXRpdGlvbnMgPSA1MDAwMDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZXRpdGlvbnM7IGkrKykgeworICAgICAgICAgICAgYmFzZTY0T3V0LndyaXRlKGRhdGEpOworICAgICAgICB9CisgICAgICAgIGJhc2U2NE91dC5jbG9zZSgpOworCisgICAgICAgIGxvbmcgZHQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHQwOworICAgICAgICBsb25nIHRvdGFsQnl0ZXMgPSBkYXRhLmxlbmd0aCAqIChsb25nKSByZXBldGl0aW9uczsKKworICAgICAgICBkb3VibGUgbWJQZXJTZWMgPSAodG90YWxCeXRlcyAvIDEwMjQuMCAvIDEwMjQpIC8gKGR0IC8gMTAwMC4wKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZHQgKyAiIG1zIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b3RhbEJ5dGVzICsgIiBieXRlcyIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWJQZXJTZWMgKyAiIG1iL3NlYyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBpbml0RGF0YShpbnQgc2l6ZSkgeworICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShzaXplKTsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhkYXRhKTsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvYmVuY2htYXJrcy9zcmMvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovTG9uZ011bHRpcGFydFJlYWRCZW5jaC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvYmVuY2htYXJrcy9zcmMvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovTG9uZ011bHRpcGFydFJlYWRCZW5jaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZGJmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9iZW5jaG1hcmtzL3NyYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9Mb25nTXVsdGlwYXJ0UmVhZEJlbmNoLmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGo7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLkNvZGVjVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkJvZHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLlNpbXBsZUNvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5BYnN0cmFjdENvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZVN0cmVhbVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZVRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlLk1lbW9yeVN0b3JhZ2VQcm92aWRlcjsKKworcHVibGljIGNsYXNzIExvbmdNdWx0aXBhcnRSZWFkQmVuY2ggeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBsb2FkTWVzc2FnZSgibG9uZy1tdWx0aXBhcnQubXNnIik7CisgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVGVzdCBtZXNzYWdlIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHRlc3ROdW1iZXIgPSBhcmdzLmxlbmd0aCA+IDAgPyBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbMF0pIDogMDsKKworICAgICAgICBUZXN0IHRlc3QgPSBjcmVhdGVUZXN0KHRlc3ROdW1iZXIpOworICAgICAgICBpZiAodGVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIk5vIHN1Y2ggdGVzdDogIiArIHRlc3ROdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJlcGV0aXRpb25zID0gYXJncy5sZW5ndGggPiAxID8gSW50ZWdlci5wYXJzZUludChhcmdzWzFdKSA6IDI1MDAwOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwYXJ0IG1lc3NhZ2UgcmVhZC4iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJObyBvZiByZXBldGl0aW9uczogIiArIHJlcGV0aXRpb25zKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb250ZW50IGxlbmd0aDogIiArIGNvbnRlbnQubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0OiAiICsgdGVzdC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJXYXJtdXAuLi4gIik7CisgICAgICAgIGxvbmcgdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdDAgPCAxNTAwKSB7CisgICAgICAgICAgICB0ZXN0LnJ1bihjb250ZW50LCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJkb25lIik7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCisgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgdGVzdC5ydW4oY29udGVudCwgcmVwZXRpdGlvbnMpOworICAgICAgICBsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGRvdWJsZSBzZWNvbmRzID0gKGZpbmlzaCAtIHN0YXJ0KSAvIDEwMDAuMDsKKyAgICAgICAgZG91YmxlIG1iID0gY29udGVudC5sZW5ndGggKiByZXBldGl0aW9ucyAvIDEwMjQuMCAvIDEwMjQ7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJFeGVjdXRpb24gdGltZTogJWYgc2VjXG4iLCBzZWNvbmRzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiUuMmYgbWVzc2FnZXMvc2VjXG4iLCByZXBldGl0aW9ucyAvIHNlY29uZHMpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJS4yZiBtYi9zZWNcbiIsIG1iIC8gc2Vjb25kcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVGVzdCBjcmVhdGVUZXN0KGludCB0ZXN0TnVtYmVyKSB7CisgICAgICAgIHN3aXRjaCAodGVzdE51bWJlcikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICByZXR1cm4gbmV3IE1pbWVUb2tlblN0cmVhbVRlc3QoKTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdENvbnRlbnRIYW5kbGVyVGVzdCgpOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUNvbnRlbnRIYW5kbGVyVGVzdCgpOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VUZXN0KCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBsb2FkTWVzc2FnZShTdHJpbmcgcmVzb3VyY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGFzc0xvYWRlciBjbCA9IExvbmdNdWx0aXBhcnRSZWFkQmVuY2guY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0c3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IGNsLmdldFJlc291cmNlQXNTdHJlYW0ocmVzb3VyY2VOYW1lKTsKKyAgICAgICAgaWYgKGluc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb2RlY1V0aWwuY29weShpbnN0cmVhbSwgb3V0c3RyZWFtKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGluc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3V0c3RyZWFtLnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgVGVzdCB7CisgICAgICAgIHZvaWQgcnVuKGJ5dGVbXSBjb250ZW50LCBpbnQgcmVwZXRpdGlvbnMpIHRocm93cyBFeGNlcHRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWltZVRva2VuU3RyZWFtVGVzdCBpbXBsZW1lbnRzIFRlc3QgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oYnl0ZVtdIGNvbnRlbnQsIGludCByZXBldGl0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBNaW1lVG9rZW5TdHJlYW0gc3RyZWFtID0gbmV3IE1pbWVUb2tlblN0cmVhbSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgc3RhdGUgPSBzdHJlYW0uZ2V0U3RhdGUoKTsgc3RhdGUgIT0gTWltZVRva2VuU3RyZWFtLlRfRU5EX09GX1NUUkVBTTsgc3RhdGUgPSBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBYnN0cmFjdENvbnRlbnRIYW5kbGVyVGVzdCBpbXBsZW1lbnRzIFRlc3QgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oYnl0ZVtdIGNvbnRlbnQsIGludCByZXBldGl0aW9ucykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBDb250ZW50SGFuZGxlciBjb250ZW50SGFuZGxlciA9IG5ldyBBYnN0cmFjdENvbnRlbnRIYW5kbGVyKCkgeworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgTWltZVN0cmVhbVBhcnNlciBwYXJzZXIgPSBuZXcgTWltZVN0cmVhbVBhcnNlcigpOworICAgICAgICAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihjb250ZW50SGFuZGxlcik7CisgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTaW1wbGVDb250ZW50SGFuZGxlclRlc3QgaW1wbGVtZW50cyBUZXN0IHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKGJ5dGVbXSBjb250ZW50LCBpbnQgcmVwZXRpdGlvbnMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgQ29udGVudEhhbmRsZXIgY29udGVudEhhbmRsZXIgPSBuZXcgU2ltcGxlQ29udGVudEhhbmRsZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYm9keURlY29kZWQoQm9keURlc2NyaXB0b3IgYmQsIElucHV0U3RyZWFtIGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoZWFkZXJzKEhlYWRlciBoZWFkZXIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGV0aXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBNaW1lU3RyZWFtUGFyc2VyIHBhcnNlciA9IG5ldyBNaW1lU3RyZWFtUGFyc2VyKCk7CisgICAgICAgICAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGNvbnRlbnRIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VUZXN0IGltcGxlbWVudHMgVGVzdCB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihieXRlW10gY29udGVudCwgaW50IHJlcGV0aXRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIERlZmF1bHRTdG9yYWdlUHJvdmlkZXIuc2V0SW5zdGFuY2UobmV3IE1lbW9yeVN0b3JhZ2VQcm92aWRlcigpKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgLy8gcmVxdWlyZXMgbWFpbC5qYXIgYW5kIGFjdGl2YXRpb24uamFyIHRvIGJlIHByZXNlbnQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNaW1lTWVzc2FnZVRlc3QgaW1wbGVtZW50cyBUZXN0IHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKGJ5dGVbXSBjb250ZW50LCBpbnQgcmVwZXRpdGlvbnMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBldGl0aW9uczsgaSsrKSB7CisgICAgICAgICAgICAgICAgTWltZU1lc3NhZ2UgbW0gPSBuZXcgTWltZU1lc3NhZ2UobnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpKTsKKyAgICAgICAgICAgICAgICBNdWx0aXBhcnQgbXVsdGlwYXJ0ID0gKE11bHRpcGFydCkgbW0uZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgIG11bHRpcGFydC5nZXRDb3VudCgpOyAvLyBmb3JjZSBwYXJzaW5nCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKi8KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvZG9hcF9KYW1lc19NaW1lNGoucmRmIGIvYXBhY2hlLW1pbWU0ai0wLjYvZG9hcF9KYW1lc19NaW1lNGoucmRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjUxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9kb2FwX0phbWVzX01pbWU0ai5yZGYKQEAgLTAsMCArMSwxMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPD94bWwtc3R5bGVzaGVldCB0eXBlPSJ0ZXh0L3hzbCI/PgorPHJkZjpSREYgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly91c2VmdWxpbmMuY29tL25zL2RvYXAjIiAKKyAgICAgICAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgCisgICAgICAgICB4bWxuczphc2ZleHQ9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL25zL2FzZmV4dCMiCisgICAgICAgICB4bWxuczpmb2FmPSJodHRwOi8veG1sbnMuY29tL2ZvYWYvMC4xLyI+Cis8IS0tCisgICAkSGVhZFVSTCQKKyAgICRSZXZpc2lvbiQKKyAgICREYXRlJAorCisgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKKyAgIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBGb3IgbW9yZQorICAgaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCisgICA8aHR0cDovL3d3dy5hcGFjaGUub3JnIC8+LgorLS0+CisKKyAgPFByb2plY3QgcmRmOmFib3V0PSJodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9taW1lNGovIj4KKyAgICA8bGljZW5zZSByZGY6cmVzb3VyY2U9Imh0dHA6Ly91c2VmdWxpbmMuY29tL2RvYXAvbGljZW5zZXMvYXNsMjAiIC8+CisgICAgPG5hbWU+QXBhY2hlIEphbWVzIE1pbWU0ajwvbmFtZT4KKyAgICA8aG9tZXBhZ2UgcmRmOnJlc291cmNlPSJodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9taW1lNGovIiAvPgorICAgIDxhc2ZleHQ6cG1jIHJkZjpyZXNvdXJjZT0iaHR0cDovL2phbWVzLmFwYWNoZS5vcmciIC8+CisgICAgPHNob3J0ZGVzYz4KK01pbWU0aiBjYW4gYmUgdXNlZCB0byBwYXJzZSBlLW1haWwgbWVzc2FnZSBzdHJlYW1zIGluIHBsYWluIHJmYzgyMiBhbmQgTUlNRSBmb3JtYXQKK2FuZCB0byBidWlsZCBhIHRyZWUgcmVwcmVzZW50YXRpb24gb2YgYW4gZS1tYWlsIG1lc3NhZ2UuCisgICAgPC9zaG9ydGRlc2M+CisgICAgPGRlc2NyaXB0aW9uPgorTWltZTRqIHByb3ZpZGVzIGEgcGFyc2VyIGZvciBlLW1haWwgbWVzc2FnZSBzdHJlYW1zIGluIHBsYWluIHJmYzgyMiBhbmQgTUlNRSBmb3JtYXQuIAorVGhlIHBhcnNlciB1c2VzIGEgY2FsbGJhY2sgbWVjaGFuaXNtIHRvIHJlcG9ydCBwYXJzaW5nIGV2ZW50cyBzdWNoIGFzIHRoZSBzdGFydCBvZiAKK2FuIGVudGl0eSBoZWFkZXIsIHRoZSBzdGFydCBvZiBhIGJvZHkuIFRoZSBwYXJzZXIgaGFzIGJlZW4gZGVzaWduZWQgdG8gYmUgZXh0cmVtZWx5IAordG9sZXJhbnQgYWdhaW5zdCBtZXNzYWdlcyB2aW9sYXRpbmcgdGhlIHN0YW5kYXJkcy4gTWltZTRqIGNhbiBhbHNvIGJlIHVzZWQgdG8gYnVpbGQgCithIHRyZWUgcmVwcmVzZW50YXRpb24gb2YgYW4gZS1tYWlsIG1lc3NhZ2UKKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgIDxidWctZGF0YWJhc2UgcmRmOnJlc291cmNlPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTUlNRTRKIiAvPgorICAgIDxtYWlsaW5nLWxpc3QgcmRmOnJlc291cmNlPSJodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9taW1lNGovbWFpbC1saXN0cy5odG1sIiAvPgorICAgIDxkb3dubG9hZC1wYWdlIHJkZjpyZXNvdXJjZT0iaHR0cDovL2phbWVzLmFwYWNoZS5vcmcvZG93bmxvYWQuY2dpIiAvPgorICAgIDxwcm9ncmFtbWluZy1sYW5ndWFnZT5KYXZhPC9wcm9ncmFtbWluZy1sYW5ndWFnZT4KKyAgICA8Y2F0ZWdvcnkgcmRmOnJlc291cmNlPSJodHRwOi8vcHJvamVjdHMuYXBhY2hlLm9yZy9jYXRlZ29yeS9tYWlsIiAvPgorICAgIDxjYXRlZ29yeSByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wcm9qZWN0cy5hcGFjaGUub3JnL2NhdGVnb3J5L2xpYnJhcnkiIC8+CisKKyAgICA8IS0tIE11bHRpcGxlIHJlbGVhc2VzIGNhbiBiZSBsaXN0ZWQsIGVhY2ggaW4gaXRzIG93biBzZWN0aW9uIC0tPgorICAgIDxyZWxlYXNlPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBKYW1lcyBNaW1lNGogMC41PC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDA4LTEwLTE4PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC41PC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICAgIDxWZXJzaW9uPgorICAgICAgICA8bmFtZT5BcGFjaGUgSmFtZXMgTWltZTRqIDAuNDwvbmFtZT4KKyAgICAgICAgPGNyZWF0ZWQ+MjAwOC0wOC0yMDwvY3JlYXRlZD4KKyAgICAgICAgPHJldmlzaW9uPjAuNDwvcmV2aXNpb24+CisgICAgICA8L1ZlcnNpb24+CisgICAgICA8VmVyc2lvbj4KKyAgICAgICAgPG5hbWU+QXBhY2hlIEphbWVzIE1pbWU0aiAwLjM8L25hbWU+CisgICAgICAgIDxjcmVhdGVkPjIwMDctMDUtMzE8L2NyZWF0ZWQ+CisgICAgICAgIDxyZXZpc2lvbj4wLjM8L3JldmlzaW9uPgorICAgICAgPC9WZXJzaW9uPgorICAgICAgPFZlcnNpb24+CisgICAgICAgIDxuYW1lPkFwYWNoZSBKYW1lcyBNaW1lNGogMC4yPC9uYW1lPgorICAgICAgICA8Y3JlYXRlZD4yMDA2LTAxLTA5PC9jcmVhdGVkPgorICAgICAgICA8cmV2aXNpb24+MC4yPC9yZXZpc2lvbj4KKyAgICAgIDwvVmVyc2lvbj4KKyAgICA8L3JlbGVhc2U+CisKKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxTVk5SZXBvc2l0b3J5PgorICAgICAgICA8bG9jYXRpb24gcmRmOnJlc291cmNlPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2phbWVzL21pbWU0ai90cnVuayIvPgorICAgICAgICA8YnJvd3NlIHJkZjpyZXNvdXJjZT0iaHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9qYW1lcy9taW1lNGovdHJ1bmsiLz4KKyAgICAgIDwvU1ZOUmVwb3NpdG9yeT4KKyAgICA8L3JlcG9zaXRvcnk+CisKKyAgICA8YXNmZXh0OmltcGxlbWVudHM+CisgICAgICA8YXNmZXh0OlN0YW5kYXJkPgorICAgICAgICA8YXNmZXh0OnRpdGxlPlN0YW5kYXJkIGZvciBBUlBBIEludGVybmV0IFRleHQgTWVzc2FnZXM8L2FzZmV4dDp0aXRsZT4KKyAgICAgICAgPGFzZmV4dDpib2R5PklFVEY8L2FzZmV4dDpib2R5PgorICAgICAgICA8YXNmZXh0OmlkPlJGQyA4MjI8L2FzZmV4dDppZD4KKyAgICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM4MjIiLz4KKyAgICAgIDwvYXNmZXh0OlN0YW5kYXJkPgorICAgIDwvYXNmZXh0OmltcGxlbWVudHM+CisgICAgPGFzZmV4dDppbXBsZW1lbnRzPgorICAgICAgPGFzZmV4dDpTdGFuZGFyZD4KKyAgICAgICAgPGFzZmV4dDp0aXRsZT5JbnRlcm5ldCBNZXNzYWdlIEZvcm1hdDwvYXNmZXh0OnRpdGxlPgorICAgICAgICA8YXNmZXh0OmJvZHk+SUVURjwvYXNmZXh0OmJvZHk+CisgICAgICAgIDxhc2ZleHQ6aWQ+UkZDIDI4MjI8L2FzZmV4dDppZD4KKyAgICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyIi8+CisgICAgICA8L2FzZmV4dDpTdGFuZGFyZD4KKyAgICA8L2FzZmV4dDppbXBsZW1lbnRzPgorICAgIDxhc2ZleHQ6aW1wbGVtZW50cz4KKyAgICAgIDxhc2ZleHQ6U3RhbmRhcmQ+CisgICAgICAgIDxhc2ZleHQ6dGl0bGU+TXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucyAoTUlNRSkgUGFydCBPbmU6IEZvcm1hdCBvZiBJbnRlcm5ldCBNZXNzYWdlIEJvZGllczwvYXNmZXh0OnRpdGxlPgorICAgICAgICA8YXNmZXh0OmJvZHk+SUVURjwvYXNmZXh0OmJvZHk+CisgICAgICAgIDxhc2ZleHQ6aWQ+UkZDIDIwNDU8L2FzZmV4dDppZD4KKyAgICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMDQ1Ii8+CisgICAgICA8L2FzZmV4dDpTdGFuZGFyZD4KKyAgICA8L2FzZmV4dDppbXBsZW1lbnRzPgorICAgIDxhc2ZleHQ6aW1wbGVtZW50cz4KKyAgICAgIDxhc2ZleHQ6U3RhbmRhcmQ+CisgICAgICAgIDxhc2ZleHQ6dGl0bGU+TXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9ucyAoTUlNRSkgUGFydCBUd286IE1lZGlhIFR5cGVzPC9hc2ZleHQ6dGl0bGU+CisgICAgICAgIDxhc2ZleHQ6Ym9keT5JRVRGPC9hc2ZleHQ6Ym9keT4KKyAgICAgICAgPGFzZmV4dDppZD5SRkMgMjA0NjwvYXNmZXh0OmlkPgorICAgICAgICA8YXNmZXh0OnVybCByZGY6cmVzb3VyY2U9Imh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDYiLz4KKyAgICAgIDwvYXNmZXh0OlN0YW5kYXJkPgorICAgIDwvYXNmZXh0OmltcGxlbWVudHM+CisgICAgPGFzZmV4dDppbXBsZW1lbnRzPgorICAgICAgPGFzZmV4dDpTdGFuZGFyZD4KKyAgICAgICAgPGFzZmV4dDp0aXRsZT5NdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb25zIChNSU1FKSBQYXJ0IFRocmVlOiBNZXNzYWdlIEhlYWRlciBFeHRlbnNpb25zIGZvciBOb24tQVNDSUkgVGV4dDwvYXNmZXh0OnRpdGxlPgorICAgICAgICA8YXNmZXh0OmJvZHk+SUVURjwvYXNmZXh0OmJvZHk+CisgICAgICAgIDxhc2ZleHQ6aWQ+UkZDIDIwNDc8L2FzZmV4dDppZD4KKyAgICAgICAgPGFzZmV4dDp1cmwgcmRmOnJlc291cmNlPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMDQ3Ii8+CisgICAgICA8L2FzZmV4dDpTdGFuZGFyZD4KKyAgICA8L2FzZmV4dDppbXBsZW1lbnRzPgorCisgIDwvUHJvamVjdD4KKzwvcmRmOlJERj4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L2V4YW1wbGVzL3NyYy9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3NhbXBsZXMvZG9tL011bHRpcGFydE1lc3NhZ2UuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L2V4YW1wbGVzL3NyYy9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3NhbXBsZXMvZG9tL011bHRpcGFydE1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmFlMWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvZXhhbXBsZXMvc3JjL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc2FtcGxlcy9kb20vTXVsdGlwYXJ0TWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnNhbXBsZXMuZG9tOworCitpbXBvcnQgamF2YS5hd3QuQmFzaWNTdHJva2U7CitpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlSU87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLk1haWxib3g7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5CaW5hcnlCb2R5OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuQm9keUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5Cb2R5UGFydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLk1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5NdWx0aXBhcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5UZXh0Qm9keTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlLlN0b3JhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZS5TdG9yYWdlT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuU3RvcmFnZVByb3ZpZGVyOworCisvKioKKyAqIENyZWF0ZXMgYSBtdWx0aXBhcnQvbWl4ZWQgbWVzc2FnZSB0aGF0IGNvbnNpc3RzIG9mIGEgdGV4dC9wbGFpbiBhbmQgYW4KKyAqIGltYWdlL3BuZyBwYXJ0LiBUaGUgaW1hZ2UgaXMgY3JlYXRlZCBvbiB0aGUgZmx5OyBhIHNpbWlsYXIgdGVjaG5pcXVlIGNhbiBiZQorICogdXNlZCB0byBjcmVhdGUgUERGIG9yIFhNTCBhdHRhY2htZW50cywgZm9yIGV4YW1wbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBhcnRNZXNzYWdlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyAxKSBzdGFydCB3aXRoIGFuIGVtcHR5IG1lc3NhZ2UKKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOworCisgICAgICAgIC8vIDIpIHNldCBoZWFkZXIgZmllbGRzCisKKyAgICAgICAgLy8gRGF0ZSBhbmQgRnJvbSBhcmUgcmVxdWlyZWQgZmllbGRzCisgICAgICAgIG1lc3NhZ2Uuc2V0RGF0ZShuZXcgRGF0ZSgpKTsKKyAgICAgICAgbWVzc2FnZS5zZXRGcm9tKE1haWxib3gucGFyc2UoIkpvaG4gRG9lIDxqZG9lQG1hY2hpbmUuZXhhbXBsZT4iKSk7CisKKyAgICAgICAgLy8gTWVzc2FnZS1JRCBzaG91bGQgYmUgcHJlc2VudAorICAgICAgICBtZXNzYWdlLmNyZWF0ZU1lc3NhZ2VJZCgibWFjaGluZS5leGFtcGxlIik7CisKKyAgICAgICAgLy8gc2V0IHNvbWUgb3B0aW9uYWwgZmllbGRzCisgICAgICAgIG1lc3NhZ2Uuc2V0VG8oTWFpbGJveC5wYXJzZSgiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iKSk7CisgICAgICAgIG1lc3NhZ2Uuc2V0U3ViamVjdCgiQW4gaW1hZ2UgZm9yIHlvdSIpOworCisgICAgICAgIC8vIDMpIHNldCBhIG11bHRpcGFydCBib2R5CisKKyAgICAgICAgTXVsdGlwYXJ0IG11bHRpcGFydCA9IG5ldyBNdWx0aXBhcnQoIm1peGVkIik7CisKKyAgICAgICAgLy8gYSBtdWx0aXBhcnQgbWF5IGhhdmUgYSBwcmVhbWJsZQorICAgICAgICBtdWx0aXBhcnQuc2V0UHJlYW1ibGUoIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuIik7CisKKyAgICAgICAgLy8gZmlyc3QgcGFydCBpcyB0ZXh0L3BsYWluCisgICAgICAgIEJvZHlGYWN0b3J5IGJvZHlGYWN0b3J5ID0gbmV3IEJvZHlGYWN0b3J5KCk7CisgICAgICAgIEJvZHlQYXJ0IHRleHRQYXJ0ID0gY3JlYXRlVGV4dFBhcnQoYm9keUZhY3RvcnksICJXaHkgc28gc2VyaW91cz8iKTsKKyAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KHRleHRQYXJ0KTsKKworICAgICAgICAvLyBzZWNvbmQgcGFydCBpcyBpbWFnZS9wbmcgKGltYWdlIGlzIGNyZWF0ZWQgb24gdGhlIGZseSkKKyAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWFnZSA9IHJlbmRlclNhbXBsZUltYWdlKCk7CisgICAgICAgIEJvZHlQYXJ0IGltYWdlUGFydCA9IGNyZWF0ZUltYWdlUGFydChib2R5RmFjdG9yeSwgaW1hZ2UpOworICAgICAgICBtdWx0aXBhcnQuYWRkQm9keVBhcnQoaW1hZ2VQYXJ0KTsKKworICAgICAgICAvLyBzZXRNdWx0aXBhcnQgYWxzbyBzZXRzIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGZpZWxkCisgICAgICAgIG1lc3NhZ2Uuc2V0TXVsdGlwYXJ0KG11bHRpcGFydCk7CisKKyAgICAgICAgLy8gNCkgcHJpbnQgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQKKworICAgICAgICBtZXNzYWdlLndyaXRlVG8oU3lzdGVtLm91dCk7CisKKyAgICAgICAgLy8gNSkgbWVzc2FnZSBpcyBubyBsb25nZXIgbmVlZGVkIGFuZCBzaG91bGQgYmUgZGlzcG9zZWQgb2YKKworICAgICAgICBtZXNzYWdlLmRpc3Bvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgdGV4dCBwYXJ0IGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQm9keVBhcnQgY3JlYXRlVGV4dFBhcnQoQm9keUZhY3RvcnkgYm9keUZhY3RvcnksIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIC8vIFVzZSBVVEYtOCB0byBlbmNvZGUgdGhlIHNwZWNpZmllZCB0ZXh0CisgICAgICAgIFRleHRCb2R5IGJvZHkgPSBib2R5RmFjdG9yeS50ZXh0Qm9keSh0ZXh0LCAiVVRGLTgiKTsKKworICAgICAgICAvLyBDcmVhdGUgYSB0ZXh0L3BsYWluIGJvZHkgcGFydAorICAgICAgICBCb2R5UGFydCBib2R5UGFydCA9IG5ldyBCb2R5UGFydCgpOworICAgICAgICBib2R5UGFydC5zZXRUZXh0KGJvZHkpOworICAgICAgICBib2R5UGFydC5zZXRDb250ZW50VHJhbnNmZXJFbmNvZGluZygicXVvdGVkLXByaW50YWJsZSIpOworCisgICAgICAgIHJldHVybiBib2R5UGFydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYmluYXJ5IHBhcnQgZnJvbSB0aGUgc3BlY2lmaWVkIGltYWdlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEJvZHlQYXJ0IGNyZWF0ZUltYWdlUGFydChCb2R5RmFjdG9yeSBib2R5RmFjdG9yeSwKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIENyZWF0ZSBhIGJpbmFyeSBtZXNzYWdlIGJvZHkgZnJvbSB0aGUgaW1hZ2UKKyAgICAgICAgU3RvcmFnZVByb3ZpZGVyIHN0b3JhZ2VQcm92aWRlciA9IGJvZHlGYWN0b3J5LmdldFN0b3JhZ2VQcm92aWRlcigpOworICAgICAgICBTdG9yYWdlIHN0b3JhZ2UgPSBzdG9yZUltYWdlKHN0b3JhZ2VQcm92aWRlciwgaW1hZ2UsICJwbmciKTsKKyAgICAgICAgQmluYXJ5Qm9keSBib2R5ID0gYm9keUZhY3RvcnkuYmluYXJ5Qm9keShzdG9yYWdlKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBib2R5IHBhcnQgd2l0aCB0aGUgY29ycmVjdCBNSU1FLXR5cGUgYW5kIHRyYW5zZmVyIGVuY29kaW5nCisgICAgICAgIEJvZHlQYXJ0IGJvZHlQYXJ0ID0gbmV3IEJvZHlQYXJ0KCk7CisgICAgICAgIGJvZHlQYXJ0LnNldEJvZHkoYm9keSwgImltYWdlL3BuZyIpOworICAgICAgICBib2R5UGFydC5zZXRDb250ZW50VHJhbnNmZXJFbmNvZGluZygiYmFzZTY0Iik7CisKKyAgICAgICAgLy8gU3BlY2lmeSBhIGZpbGVuYW1lIGluIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciAoaW1wbGljaXRseSBzZXRzCisgICAgICAgIC8vIHRoZSBkaXNwb3NpdGlvbiB0eXBlIHRvICJhdHRhY2htZW50IikKKyAgICAgICAgYm9keVBhcnQuc2V0RmlsZW5hbWUoInNtaWxleS5wbmciKTsKKworICAgICAgICByZXR1cm4gYm9keVBhcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcmVzIHRoZSBzcGVjaWZpZWQgaW1hZ2UgaW4gYSBTdG9yYWdlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdG9yYWdlIHN0b3JlSW1hZ2UoU3RvcmFnZVByb3ZpZGVyIHN0b3JhZ2VQcm92aWRlciwKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UsIFN0cmluZyBmb3JtYXROYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBBbiBvdXRwdXQgc3RyZWFtIHRoYXQgaXMgY2FwYWJsZSBvZiBidWlsZGluZyBhIFN0b3JhZ2Ugb2JqZWN0LgorICAgICAgICBTdG9yYWdlT3V0cHV0U3RyZWFtIG91dCA9IHN0b3JhZ2VQcm92aWRlci5jcmVhdGVTdG9yYWdlT3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgLy8gV3JpdGUgdGhlIGltYWdlIHRvIG91ciBvdXRwdXQgc3RyZWFtLiBBIFN0b3JhZ2VPdXRwdXRTdHJlYW0gY2FuIGJlCisgICAgICAgIC8vIHVzZWQgdG8gY3JlYXRlIGF0dGFjaG1lbnRzIHVzaW5nIGFueSBBUEkgdGhhdCBzdXBwb3J0cyB3cml0aW5nIGEKKyAgICAgICAgLy8gZG9jdW1lbnQgdG8gYW4gb3V0cHV0IHN0cmVhbSwgZS5nLiBpVGV4dCdzIFBkZldyaXRlci4KKyAgICAgICAgSW1hZ2VJTy53cml0ZShpbWFnZSwgZm9ybWF0TmFtZSwgb3V0KTsKKworICAgICAgICAvLyBJbXBsaWNpdGx5IGNsb3NlcyB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgcmV0dXJucyB0aGUgZGF0YSB0aGF0IGhhcworICAgICAgICAvLyBiZWVuIHdyaXR0ZW4gdG8gaXQuCisgICAgICAgIHJldHVybiBvdXQudG9TdG9yYWdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHJhd3MgYW4gaW1hZ2U7IHVucmVsYXRlZCB0byBNaW1lNGouCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRJbWFnZSByZW5kZXJTYW1wbGVJbWFnZSgpIHsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLmF3dC5oZWFkbGVzcyIsICJ0cnVlIik7CisKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSAxMDA7CisKKyAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWcgPSBuZXcgQnVmZmVyZWRJbWFnZShzaXplLCBzaXplLAorICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9CWVRFX0dSQVkpOworCisgICAgICAgIEdyYXBoaWNzMkQgZ2Z4ID0gaW1nLmNyZWF0ZUdyYXBoaWNzKCk7CisgICAgICAgIGdmeC5zZXRSZW5kZXJpbmdIaW50KFJlbmRlcmluZ0hpbnRzLktFWV9BTlRJQUxJQVNJTkcsCisgICAgICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKKyAgICAgICAgZ2Z4LnNldFN0cm9rZShuZXcgQmFzaWNTdHJva2Uoc2l6ZSAvIDQwZiwgQmFzaWNTdHJva2UuQ0FQX1JPVU5ELAorICAgICAgICAgICAgICAgIEJhc2ljU3Ryb2tlLkpPSU5fUk9VTkQpKTsKKworICAgICAgICBnZnguc2V0Q29sb3IoQ29sb3IuQkxBQ0spOworICAgICAgICBnZnguc2V0QmFja2dyb3VuZChDb2xvci5XSElURSk7CisgICAgICAgIGdmeC5jbGVhclJlY3QoMCwgMCwgc2l6ZSwgc2l6ZSk7CisKKyAgICAgICAgaW50IGIgPSBzaXplIC8gMzA7CisgICAgICAgIGdmeC5kcmF3T3ZhbChiLCBiLCBzaXplIC0gMSAtIDIgKiBiLCBzaXplIC0gMSAtIDIgKiBiKTsKKworICAgICAgICBpbnQgZXN6ID0gc2l6ZSAvIDc7CisgICAgICAgIGludCBleCA9IChpbnQpICgwLjI3ZiAqIHNpemUpOworICAgICAgICBnZnguZHJhd092YWwoZXgsIGV4LCBlc3osIGVzeik7CisgICAgICAgIGdmeC5kcmF3T3ZhbChzaXplIC0gMSAtIGVzeiAtIGV4LCBleCwgZXN6LCBlc3opOworCisgICAgICAgIGIgPSBzaXplIC8gNTsKKyAgICAgICAgZ2Z4LmRyYXdBcmMoYiwgYiwgc2l6ZSAtIDEgLSAyICogYiwgc2l6ZSAtIDEgLSAyICogYiwgMjAwLCAxNDApOworCisgICAgICAgIHJldHVybiBpbWc7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9leGFtcGxlcy9zcmMvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zYW1wbGVzL2RvbS9UZXh0UGxhaW5NZXNzYWdlLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9leGFtcGxlcy9zcmMvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zYW1wbGVzL2RvbS9UZXh0UGxhaW5NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5YjkzOAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L2V4YW1wbGVzL3NyYy9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3NhbXBsZXMvZG9tL1RleHRQbGFpbk1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnNhbXBsZXMuZG9tOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MuTWFpbGJveDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLkJvZHlGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLlRleHRCb2R5OworCisvKioKKyAqIFRoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgYSBtZXNzYWdlIHZlcnkgc2ltaWxhciB0byB0aGUgb25lIGZyb20gUkZDIDUzMjIKKyAqIEFwcGVuZGl4IEEuMS4xLgorICovCitwdWJsaWMgY2xhc3MgVGV4dFBsYWluTWVzc2FnZSB7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gMSkgc3RhcnQgd2l0aCBhbiBlbXB0eSBtZXNzYWdlCisKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKKworICAgICAgICAvLyAyKSBzZXQgaGVhZGVyIGZpZWxkcworCisgICAgICAgIC8vIERhdGUgYW5kIEZyb20gYXJlIHJlcXVpcmVkIGZpZWxkcworICAgICAgICBtZXNzYWdlLnNldERhdGUobmV3IERhdGUoKSk7CisgICAgICAgIG1lc3NhZ2Uuc2V0RnJvbShNYWlsYm94LnBhcnNlKCJKb2huIERvZSA8amRvZUBtYWNoaW5lLmV4YW1wbGU+IikpOworCisgICAgICAgIC8vIE1lc3NhZ2UtSUQgc2hvdWxkIGJlIHByZXNlbnQKKyAgICAgICAgbWVzc2FnZS5jcmVhdGVNZXNzYWdlSWQoIm1hY2hpbmUuZXhhbXBsZSIpOworCisgICAgICAgIC8vIHNldCBzb21lIG9wdGlvbmFsIGZpZWxkcworICAgICAgICBtZXNzYWdlLnNldFRvKE1haWxib3gucGFyc2UoIk1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+IikpOworICAgICAgICBtZXNzYWdlLnNldFN1YmplY3QoIlNheWluZyBIZWxsbyIpOworCisgICAgICAgIC8vIDMpIHNldCBhIHRleHQgYm9keQorCisgICAgICAgIEJvZHlGYWN0b3J5IGJvZHlGYWN0b3J5ID0gbmV3IEJvZHlGYWN0b3J5KCk7CisgICAgICAgIFRleHRCb2R5IGJvZHkgPSBib2R5RmFjdG9yeS50ZXh0Qm9keSgiVGhpcyBpcyBhIG1lc3NhZ2UganVzdCB0byAiCisgICAgICAgICAgICAgICAgKyAic2F5IGhlbGxvLlxyXG5TbywgXCJIZWxsb1wiLiIpOworCisgICAgICAgIC8vIG5vdGUgdGhhdCBzZXRUZXh0IGFsc28gc2V0cyB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBmaWVsZAorICAgICAgICBtZXNzYWdlLnNldFRleHQoYm9keSk7CisKKyAgICAgICAgLy8gNCkgcHJpbnQgbWVzc2FnZSB0byBzdGFuZGFyZCBvdXRwdXQKKworICAgICAgICBtZXNzYWdlLndyaXRlVG8oU3lzdGVtLm91dCk7CisKKyAgICAgICAgLy8gNSkgbWVzc2FnZSBpcyBubyBsb25nZXIgbmVlZGVkIGFuZCBzaG91bGQgYmUgZGlzcG9zZWQgb2YKKworICAgICAgICBtZXNzYWdlLmRpc3Bvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9leGFtcGxlcy9zcmMvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zYW1wbGVzL3RyYW5zZm9ybS9UcmFuc2Zvcm1NZXNzYWdlLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9leGFtcGxlcy9zcmMvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zYW1wbGVzL3RyYW5zZm9ybS9UcmFuc2Zvcm1NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViNGE5NAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L2V4YW1wbGVzL3NyYy9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3NhbXBsZXMvdHJhbnNmb3JtL1RyYW5zZm9ybU1lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zYW1wbGVzLnRyYW5zZm9ybTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuQm9keTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLkJvZHlGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuQm9keVBhcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5NZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuTXVsdGlwYXJ0OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuVGV4dEJvZHk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZS5EZWZhdWx0U3RvcmFnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuU3RvcmFnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuVGVtcEZpbGVTdG9yYWdlUHJvdmlkZXI7CisKKy8qKgorICogVGhpcyBjb2RlIHNob3VsZCBpbGx1c3RyYXRlIGhvdyB0byB0cmFuc2Zvcm0gYSBtZXNzYWdlIGludG8gYW5vdGhlciBtZXNzYWdlCisgKiB3aXRob3V0IG1vZGlmeWluZyB0aGUgb3JpZ2luYWwuCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2Zvcm1NZXNzYWdlIHsKKworICAgIC8vIEhvc3QgbmFtZSB1c2VkIGluIG1lc3NhZ2UgaWRlbnRpZmllcnMuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPU1ROQU1FID0gImxvY2FsaG9zdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRXhwbGljaXRseSBzZXQgYSBzdHJhdGVneSBmb3Igc3RvcmluZyBib2R5IHBhcnRzLiBVc3VhbGx5IG5vdAorICAgICAgICAvLyBuZWNlc3Nhcnk7IGZvciBtb3N0IGFwcGxpY2F0aW9ucyB0aGUgZGVmYXVsdCBzZXR0aW5nIGlzIGFwcHJvcHJpYXRlLgorICAgICAgICBTdG9yYWdlUHJvdmlkZXIgc3RvcmFnZVByb3ZpZGVyID0gbmV3IFRlbXBGaWxlU3RvcmFnZVByb3ZpZGVyKCk7CisgICAgICAgIERlZmF1bHRTdG9yYWdlUHJvdmlkZXIuc2V0SW5zdGFuY2Uoc3RvcmFnZVByb3ZpZGVyKTsKKworICAgICAgICAvLyBDcmVhdGUgYSB0ZW1wbGF0ZSBtZXNzYWdlLiBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBsb2FkIGEgbWVzc2FnZQorICAgICAgICAvLyBmcm9tIGFuIGlucHV0IHN0cmVhbSBidXQgZm9yIHRoaXMgZXhhbXBsZSBhIG1lc3NhZ2Ugb2JqZWN0IGlzIGNyZWF0ZWQKKyAgICAgICAgLy8gZnJvbSBzY3JhdGNoIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzLgorICAgICAgICBNZXNzYWdlIHRlbXBsYXRlID0gY3JlYXRlVGVtcGxhdGUoKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgbWVzc2FnZSBieSB0cmFuc2Zvcm1pbmcgdGhlIHRlbXBsYXRlLgorICAgICAgICBNZXNzYWdlIHRyYW5zZm9ybWVkID0gdHJhbnNmb3JtKHRlbXBsYXRlKTsKKworICAgICAgICAvLyBQcmludCB0cmFuc2Zvcm1lZCBtZXNzYWdlLgorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuXG5UcmFuc2Zvcm1lZCBtZXNzYWdlOlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICB0cmFuc2Zvcm1lZC53cml0ZVRvKFN5c3RlbS5vdXQpOworCisgICAgICAgIC8vIE1lc3NhZ2VzIHNob3VsZCBiZSBkaXNwb3NlZCBvZiB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCisgICAgICAgIC8vIERpc3Bvc2luZyBvZiBhIG1lc3NhZ2UgYWxzbyBkaXNwb3NlcyBvZiBhbGwgY2hpbGQgZWxlbWVudHMgKGUuZy4gYm9keQorICAgICAgICAvLyBwYXJ0cykgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgIHRyYW5zZm9ybWVkLmRpc3Bvc2UoKTsKKworICAgICAgICAvLyBQcmludCBvcmlnaW5hbCBtZXNzYWdlIHRvIGlsbHVzdHJhdGUgdGhhdCBpdCB3YXMgbm90IGFmZmVjdGVkIGJ5IHRoZQorICAgICAgICAvLyB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblxuT3JpZ2luYWwgdGVtcGxhdGU6XG4tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgICAgICB0ZW1wbGF0ZS53cml0ZVRvKFN5c3RlbS5vdXQpOworCisgICAgICAgIC8vIE9yaWdpbmFsIG1lc3NhZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgICAgdGVtcGxhdGUuZGlzcG9zZSgpOworCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgYWxsIHRlbXBvcmFyeSBmaWxlcyBoYXZlIGJlZW4gZGVsZXRlZCBiZWNhdXNlIGFsbAorICAgICAgICAvLyBtZXNzYWdlcyBhbmQgYm9keSBwYXJ0cyBoYXZlIGJlZW4gZGlzcG9zZWQgb2YgcHJvcGVybHkuCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBtYWtlcyBzb21lIGFyYml0cmFyeSBjaGFuZ2VzIHRvIHRoZSBjb3B5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2UgdHJhbnNmb3JtKE1lc3NhZ2Ugb3JpZ2luYWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIHRlbXBsYXRlLiBUaGUgY29weSBjYW4gYmUgbW9kaWZpZWQgd2l0aG91dAorICAgICAgICAvLyBhZmZlY3RpbmcgdGhlIG9yaWdpbmFsLgorICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShvcmlnaW5hbCk7CisKKyAgICAgICAgLy8gSW4gdGhpcyBleGFtcGxlIHdlIGtub3cgd2UgaGF2ZSBhIG11bHRpcGFydCBtZXNzYWdlLiBVc2UKKyAgICAgICAgLy8gTWVzc2FnZSNpc011bHRpcGFydCgpIGlmIHVuY2VydGFpbi4KKyAgICAgICAgTXVsdGlwYXJ0IG11bHRpcGFydCA9IChNdWx0aXBhcnQpIG1lc3NhZ2UuZ2V0Qm9keSgpOworCisgICAgICAgIC8vIEluc2VydCBhIG5ldyB0ZXh0L3BsYWluIGJvZHkgcGFydCBhZnRlciBldmVyeSBib2R5IHBhcnQgb2YgdGhlCisgICAgICAgIC8vIHRlbXBsYXRlLgorICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtdWx0aXBhcnQuZ2V0Q291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgdGV4dCA9ICJUZXh0IGluc2VydGVkIGFmdGVyIHBhcnQgIiArIChpICsgMSk7CisgICAgICAgICAgICBCb2R5UGFydCBib2R5UGFydCA9IGNyZWF0ZVRleHRQYXJ0KHRleHQpOworICAgICAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KGJvZHlQYXJ0LCAyICogaSArIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRm9yIG5vIHBhcnRpY3VsYXIgcmVhc29uIHJlbW92ZSB0aGUgc2Vjb25kIGJpbmFyeSBib2R5IHBhcnQgKG5vdworICAgICAgICAvLyBhdCBpbmRleCBmb3VyKS4KKyAgICAgICAgQm9keVBhcnQgcmVtb3ZlZCA9IG11bHRpcGFydC5yZW1vdmVCb2R5UGFydCg0KTsKKworICAgICAgICAvLyBUaGUgcmVtb3ZlZCBib2R5IHBhcnQgbm8gbG9uZ2VyIGhhcyBhIHBhcmVudCBlbnRpdHkgaXQgYmVsb25ncyB0byBzbworICAgICAgICAvLyBpdCBzaG91bGQgYmUgZGlzcG9zZWQgb2YuCisgICAgICAgIHJlbW92ZWQuZGlzcG9zZSgpOworCisgICAgICAgIC8vIFNldCBzb21lIGhlYWRlcnMgb24gdGhlIHRyYW5zZm9ybWVkIG1lc3NhZ2UKKyAgICAgICAgbWVzc2FnZS5jcmVhdGVNZXNzYWdlSWQoSE9TVE5BTUUpOworICAgICAgICBtZXNzYWdlLnNldFN1YmplY3QoIlRyYW5zZm9ybWVkIG1lc3NhZ2UiKTsKKyAgICAgICAgbWVzc2FnZS5zZXREYXRlKG5ldyBEYXRlKCkpOworICAgICAgICBtZXNzYWdlLnNldEZyb20oTWFpbGJveC5wYXJzZSgiSm9obiBEb2UgPGpkb2VAbWFjaGluZS5leGFtcGxlPiIpKTsKKworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbXVsdGlwYXJ0L21peGVkIG1lc3NhZ2UgdGhhdCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyAob25lIHRleHQsCisgICAgICogdHdvIGJpbmFyeSkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZSBjcmVhdGVUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE11bHRpcGFydCBtdWx0aXBhcnQgPSBuZXcgTXVsdGlwYXJ0KCJtaXhlZCIpOworCisgICAgICAgIEJvZHlQYXJ0IHBhcnQxID0gY3JlYXRlVGV4dFBhcnQoIlRoaXMgaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHRlbXBsYXRlLi4iKTsKKyAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KHBhcnQxKTsKKworICAgICAgICBCb2R5UGFydCBwYXJ0MiA9IGNyZWF0ZVJhbmRvbUJpbmFyeVBhcnQoMjAwKTsKKyAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KHBhcnQyKTsKKworICAgICAgICBCb2R5UGFydCBwYXJ0MyA9IGNyZWF0ZVJhbmRvbUJpbmFyeVBhcnQoMzAwKTsKKyAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KHBhcnQzKTsKKworICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICBtZXNzYWdlLnNldE11bHRpcGFydChtdWx0aXBhcnQpOworCisgICAgICAgIG1lc3NhZ2Uuc2V0U3ViamVjdCgiVGVtcGxhdGUgbWVzc2FnZSIpOworCisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB0ZXh0IHBhcnQgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCb2R5UGFydCBjcmVhdGVUZXh0UGFydChTdHJpbmcgdGV4dCkgeworICAgICAgICBUZXh0Qm9keSBib2R5ID0gbmV3IEJvZHlGYWN0b3J5KCkudGV4dEJvZHkodGV4dCwgIlVURi04Iik7CisKKyAgICAgICAgQm9keVBhcnQgYm9keVBhcnQgPSBuZXcgQm9keVBhcnQoKTsKKyAgICAgICAgYm9keVBhcnQuc2V0VGV4dChib2R5KTsKKyAgICAgICAgYm9keVBhcnQuc2V0Q29udGVudFRyYW5zZmVyRW5jb2RpbmcoInF1b3RlZC1wcmludGFibGUiKTsKKworICAgICAgICByZXR1cm4gYm9keVBhcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJpbmFyeSBwYXJ0IHdpdGggcmFuZG9tIGNvbnRlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQm9keVBhcnQgY3JlYXRlUmFuZG9tQmluYXJ5UGFydChpbnQgbnVtYmVyT2ZCeXRlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbbnVtYmVyT2ZCeXRlc107CisgICAgICAgIG5ldyBSYW5kb20oKS5uZXh0Qnl0ZXMoZGF0YSk7CisKKyAgICAgICAgQm9keSBib2R5ID0gbmV3IEJvZHlGYWN0b3J5KCkKKyAgICAgICAgICAgICAgICAuYmluYXJ5Qm9keShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSkpOworCisgICAgICAgIEJvZHlQYXJ0IGJvZHlQYXJ0ID0gbmV3IEJvZHlQYXJ0KCk7CisgICAgICAgIGJvZHlQYXJ0LnNldEJvZHkoYm9keSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgICAgICBib2R5UGFydC5zZXRDb250ZW50VHJhbnNmZXJFbmNvZGluZygiYmFzZTY0Iik7CisKKyAgICAgICAgcmV0dXJuIGJvZHlQYXJ0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvZXhhbXBsZXMvc3JjL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc2FtcGxlcy90cmVlL01lc3NhZ2VUcmVlLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9leGFtcGxlcy9zcmMvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zYW1wbGVzL3RyZWUvTWVzc2FnZVRyZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI3NTBlCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvZXhhbXBsZXMvc3JjL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc2FtcGxlcy90cmVlL01lc3NhZ2VUcmVlLmphdmEKQEAgLTAsMCArMSwzODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc2FtcGxlcy50cmVlOworCitpbXBvcnQgamF2YS5hd3QuRGltZW5zaW9uOworaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7CitpbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOworaW1wb3J0IGphdmF4LnN3aW5nLkpTcGxpdFBhbmU7CitpbXBvcnQgamF2YXguc3dpbmcuSlRleHRBcmVhOworaW1wb3J0IGphdmF4LnN3aW5nLkpUcmVlOworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVTZWxlY3Rpb25FdmVudDsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlU2VsZWN0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOworaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVNlbGVjdGlvbk1vZGVsOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQWRkcmVzc0xpc3RGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5Db250ZW50VHlwZUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkRhdGVUaW1lRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuVW5zdHJ1Y3R1cmVkRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MuTWFpbGJveExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5CaW5hcnlCb2R5OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuQm9keTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLkJvZHlQYXJ0OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuRW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLk11bHRpcGFydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLlRleHRCb2R5OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5GaWVsZDsKKworLyoqCisgKiBEaXNwbGF5cyBhIHBhcnNlZCBNZXNzYWdlIGluIGEgd2luZG93LiBUaGUgd2luZG93IHdpbGwgYmUgZGl2aWRlZCBpbnRvCisgKiB0d28gcGFuZWxzLiBUaGUgbGVmdCBwYW5lbCBkaXNwbGF5cyB0aGUgTWVzc2FnZSB0cmVlLiBDbGlja2luZyBvbiBhIAorICogbm9kZSBpbiB0aGUgdHJlZSBzaG93cyBpbmZvcm1hdGlvbiBvbiB0aGF0IG5vZGUgaW4gdGhlIHJpZ2h0IHBhbmVsLgorICoKKyAqIFNvbWUgb2YgdGhpcyBjb2RlIGhhdmUgYmVlbiBjb3BpZWQgZnJvbSB0aGUgSmF2YSB0dXRvcmlhbCdzIEpUcmVlIHNlY3Rpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlVHJlZSBleHRlbmRzIEpQYW5lbCBpbXBsZW1lbnRzIFRyZWVTZWxlY3Rpb25MaXN0ZW5lciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBwcml2YXRlIEpQYW5lbCBjb250ZW50UGFuZTsKKyAgICBwcml2YXRlIEpUZXh0QXJlYSB0ZXh0VmlldzsKKyAgICBwcml2YXRlIEpUcmVlIHRyZWU7CisKKyAgICAvKioKKyAgICAgKiBXcmFwcyBhbiBPYmplY3QgYW5kIGFzc29jaWF0ZXMgaXQgd2l0aCBhIHRleHQuIEFsbCBtZXNzYWdlIHBhcnRzIAorICAgICAqIChoZWFkZXJzLCBib2RpZXMsIG11bHRpcGFydHMsIGJvZHkgcGFydHMpIHdpbGwgYmUgd3JhcHBlZCBpbgorICAgICAqIE9iamVjdFdyYXBwZXIgaW5zdGFuY2VzIGJlZm9yZSB0aGV5IGFyZSBhZGRlZCB0byB0aGUgSlRyZWUgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPYmplY3RXcmFwcGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dCA9ICIiOworICAgICAgICBwcml2YXRlIE9iamVjdCBvYmplY3QgPSBudWxsOworICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdFdyYXBwZXIoU3RyaW5nIHRleHQsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgICAgICB0aGlzLm9iamVjdCA9IG9iamVjdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0OworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWVzc2FnZVRyZWU8L2NvZGU+IGluc3RhbmNlIGRpc3BsYXlpbmcgdGhlIAorICAgICAqIHNwZWNpZmllZCA8Y29kZT5NZXNzYWdlPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBkaXNwbGF5LgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlVHJlZShNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobmV3IEdyaWRMYXlvdXQoMSwwKSk7CisKKyAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSByb290ID0gY3JlYXRlTm9kZShtZXNzYWdlKTsKKworICAgICAgICB0cmVlID0gbmV3IEpUcmVlKHJvb3QpOworICAgICAgICB0cmVlLmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0U2VsZWN0aW9uTW9kZSgKKyAgICAgICAgICAgICAgICBUcmVlU2VsZWN0aW9uTW9kZWwuU0lOR0xFX1RSRUVfU0VMRUNUSU9OKTsKKworICAgICAgICB0cmVlLmFkZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKKworICAgICAgICBKU2Nyb2xsUGFuZSB0cmVlVmlldyA9IG5ldyBKU2Nyb2xsUGFuZSh0cmVlKTsKKworICAgICAgICBjb250ZW50UGFuZSA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwwKSk7CisgICAgICAgIEpTY3JvbGxQYW5lIGNvbnRlbnRWaWV3ID0gbmV3IEpTY3JvbGxQYW5lKGNvbnRlbnRQYW5lKTsKKworICAgICAgICBKU3BsaXRQYW5lIHNwbGl0UGFuZSA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCk7CisgICAgICAgIHNwbGl0UGFuZS5zZXRMZWZ0Q29tcG9uZW50KHRyZWVWaWV3KTsKKyAgICAgICAgc3BsaXRQYW5lLnNldFJpZ2h0Q29tcG9uZW50KGNvbnRlbnRWaWV3KTsKKworICAgICAgICBEaW1lbnNpb24gbWluaW11bVNpemUgPSBuZXcgRGltZW5zaW9uKDEwMCwgNTApOworICAgICAgICBjb250ZW50Vmlldy5zZXRNaW5pbXVtU2l6ZShtaW5pbXVtU2l6ZSk7CisgICAgICAgIHRyZWVWaWV3LnNldE1pbmltdW1TaXplKG1pbmltdW1TaXplKTsKKyAgICAgICAgc3BsaXRQYW5lLnNldERpdmlkZXJMb2NhdGlvbigyNTApOworICAgICAgICBzcGxpdFBhbmUuc2V0UHJlZmVycmVkU2l6ZShuZXcgRGltZW5zaW9uKDc1MCwgNTAwKSk7CisKKyAgICAgICAgYWRkKHNwbGl0UGFuZSk7CisgICAgICAgIAorICAgICAgICB0ZXh0VmlldyA9IG5ldyBKVGV4dEFyZWEoKTsKKyAgICAgICAgdGV4dFZpZXcuc2V0RWRpdGFibGUoZmFsc2UpOworICAgICAgICB0ZXh0Vmlldy5zZXRMaW5lV3JhcCh0cnVlKTsKKyAgICAgICAgY29udGVudFBhbmUuYWRkKHRleHRWaWV3KTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbm9kZSBnaXZlbiBhIE11bHRpcGFydCBib2R5LgorICAgICAqIEFkZCB0aGUgUHJlYW1ibGUsIGFsbCBCb2R5IHBhcnRzIGFuZCB0aGUgRXBpbG9ndWUgdG8gdGhlIG5vZGUuCisgICAgICogCisgICAgICogQHBhcmFtIG11bHRpcGFydCB0aGUgTXVsdGlwYXJ0LgorICAgICAqIEByZXR1cm4gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgY3JlYXRlTm9kZShIZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RXcmFwcGVyKCJIZWFkZXIiLCBoZWFkZXIpKTsKKworICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogaGVhZGVyLmdldEZpZWxkcygpKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUobmV3IE9iamVjdFdyYXBwZXIobmFtZSwgZmllbGQpKSk7CisgICAgICAgIH0gICAgICAgIAorCisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBub2RlIGdpdmVuIGEgTXVsdGlwYXJ0IGJvZHkuCisgICAgICogQWRkIHRoZSBQcmVhbWJsZSwgYWxsIEJvZHkgcGFydHMgYW5kIHRoZSBFcGlsb2d1ZSB0byB0aGUgbm9kZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbXVsdGlwYXJ0IHRoZSBNdWx0aXBhcnQuCisgICAgICogQHJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlLgorICAgICAqLworICAgIHByaXZhdGUgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBjcmVhdGVOb2RlKE11bHRpcGFydCBtdWx0aXBhcnQpIHsKKyAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFdyYXBwZXIoIk11bHRpcGFydCIsIG11bHRpcGFydCkpOworCisgICAgICAgIG5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKAorICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0V3JhcHBlcigiUHJlYW1ibGUiLCBtdWx0aXBhcnQuZ2V0UHJlYW1ibGUoKSkpKTsKKyAgICAgICAgZm9yIChCb2R5UGFydCBwYXJ0IDogbXVsdGlwYXJ0LmdldEJvZHlQYXJ0cygpKSB7CisgICAgICAgICAgICBub2RlLmFkZChjcmVhdGVOb2RlKHBhcnQpKTsKKyAgICAgICAgfQorICAgICAgICBub2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFdyYXBwZXIoIkVwaWxvZ3VlIiwgbXVsdGlwYXJ0LmdldEVwaWxvZ3VlKCkpKSk7CisKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIHRyZWUgbm9kZXMgZ2l2ZW4gYSBNSU1FIGVudGl0eSAoZWl0aGVyIGEgTWVzc2FnZSBvciAKKyAgICAgKiBhIEJvZHlQYXJ0KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZW50aXR5IHRoZSBlbnRpdHkuCisgICAgICogQHJldHVybiB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIGRpc3BsYXlpbmcgdGhlIHNwZWNpZmllZCBlbnRpdHkgYW5kIAorICAgICAqICAgICAgICAgaXRzIGNoaWxkcmVuLgorICAgICAqLworICAgIHByaXZhdGUgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBjcmVhdGVOb2RlKEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIENyZWF0ZSB0aGUgcm9vdCBub2RlIGZvciB0aGUgZW50aXR5LiBJdCdzIGVpdGhlciBhCisgICAgICAgICAqIE1lc3NhZ2Ugb3IgYSBCb2R5IHBhcnQuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgdHlwZSA9ICJNZXNzYWdlIjsKKyAgICAgICAgaWYgKGVudGl0eSBpbnN0YW5jZW9mIEJvZHlQYXJ0KSB7CisgICAgICAgICAgICB0eXBlID0gIkJvZHkgcGFydCI7CisgICAgICAgIH0KKyAgICAgICAgRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RXcmFwcGVyKHR5cGUsIGVudGl0eSkpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFkZCB0aGUgbm9kZSBlbmNhcHN1bGF0aW5nIHRoZSBlbnRpdHkgSGVhZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgbm9kZS5hZGQoY3JlYXRlTm9kZShlbnRpdHkuZ2V0SGVhZGVyKCkpKTsKKyAgICAgICAgCisgICAgICAgIEJvZHkgYm9keSA9IGVudGl0eS5nZXRCb2R5KCk7CisgICAgICAgIAorICAgICAgICBpZiAoYm9keSBpbnN0YW5jZW9mIE11bHRpcGFydCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBib2R5IG9mIHRoZSBlbnRpdHkgaXMgYSBNdWx0aXBhcnQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbm9kZS5hZGQoY3JlYXRlTm9kZSgoTXVsdGlwYXJ0KSBib2R5KSk7CisgICAgICAgIH0gZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgYm9keSBpcyBhbm90aGVyIE1lc3NhZ2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgbm9kZS5hZGQoY3JlYXRlTm9kZSgoTWVzc2FnZSkgYm9keSkpOworICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRGlzY3JldGUgQm9keSAoZWl0aGVyIG9mIHR5cGUgVGV4dEJvZHkgb3IgQmluYXJ5Qm9keSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHR5cGUgPSAiVGV4dCBib2R5IjsKKyAgICAgICAgICAgIGlmIChib2R5IGluc3RhbmNlb2YgQmluYXJ5Qm9keSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSAiQmluYXJ5IGJvZHkiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB0eXBlICs9ICIgKCIgKyBlbnRpdHkuZ2V0TWltZVR5cGUoKSArICIpIjsKKyAgICAgICAgICAgIG5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKG5ldyBPYmplY3RXcmFwcGVyKHR5cGUsIGJvZHkpKSk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuZXZlciB0aGUgc2VsZWN0aW9uIGNoYW5nZXMgaW4gdGhlIEpUcmVlIGluc3RhbmNlIHNob3dpbmcKKyAgICAgKiB0aGUgTWVzc2FnZSBub2Rlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZSB0aGUgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7CisgICAgICAgIERlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKQorICAgICAgICAgICAgICAgIHRyZWUuZ2V0TGFzdFNlbGVjdGVkUGF0aENvbXBvbmVudCgpOworCisgICAgICAgIHRleHRWaWV3LnNldFRleHQoIiIpOworICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBPYmplY3QgbyA9ICgoT2JqZWN0V3JhcHBlcikgbm9kZS5nZXRVc2VyT2JqZWN0KCkpLmdldE9iamVjdCgpOworCisgICAgICAgIGlmIChub2RlLmlzTGVhZigpKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGV4dEJvZHkpeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQSB0ZXh0IGJvZHkuIERpc3BsYXkgaXRzIGNvbnRlbnRzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFRleHRCb2R5IGJvZHkgPSAoVGV4dEJvZHkpIG87CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgUmVhZGVyIHIgPSBib2R5LmdldFJlYWRlcigpOworICAgICAgICAgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjID0gci5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBCaW5hcnlCb2R5KXsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEEgYmluYXJ5IGJvZHkuIERpc3BsYXkgaXRzIE1JTUUgdHlwZSBhbmQgbGVuZ3RoIGluIGJ5dGVzLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEJpbmFyeUJvZHkgYm9keSA9IChCaW5hcnlCb2R5KSBvOworICAgICAgICAgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGJvZHkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpcy5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCgiQmluYXJ5IGJvZHlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNSU1FIHR5cGU6ICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYm9keS5nZXRQYXJlbnQoKS5nZXRNaW1lVHlwZSgpICsgIlxuIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTaXplIG9mIGRlY29kZWQgZGF0YTogIiArIHNpemUgKyAiIGJ5dGVzIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBDb250ZW50VHlwZUZpZWxkKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDb250ZW50LVR5cGUgZmllbGQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQ29udGVudFR5cGVGaWVsZCBmaWVsZCA9IChDb250ZW50VHlwZUZpZWxkKSBvOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiTUlNRSB0eXBlOiAiICsgZmllbGQuZ2V0TWltZVR5cGUoKSArICJcbiIpOworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gZmllbGQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBwYXJhbXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUgKyAiID0gIiArIHBhcmFtcy5nZXQobmFtZSkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEFkZHJlc3NMaXN0RmllbGQpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFuIGFkZHJlc3MgZmllbGQgKEZyb20sIFRvLCBDYywgZXRjKQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIEFkZHJlc3NMaXN0RmllbGQgZmllbGQgPSAoQWRkcmVzc0xpc3RGaWVsZCkgbzsKKyAgICAgICAgICAgICAgICBNYWlsYm94TGlzdCBsaXN0ID0gZmllbGQuZ2V0QWRkcmVzc0xpc3QoKS5mbGF0dGVuKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIE1haWxib3ggbWIgPSBsaXN0LmdldChpKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKG1iLmdldERpc3BsYXlTdHJpbmcoKSArICJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgRGF0ZVRpbWVGaWVsZCkgeworICAgICAgICAgICAgICAgIERhdGUgZGF0ZSA9ICgoRGF0ZVRpbWVGaWVsZCkgbykuZ2V0RGF0ZSgpOworICAgICAgICAgICAgICAgIHRleHRWaWV3LnNldFRleHQoZGF0ZS50b1N0cmluZygpKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBVbnN0cnVjdHVyZWRGaWVsZCl7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCgoKFVuc3RydWN0dXJlZEZpZWxkKSBvKS5nZXRWYWx1ZSgpKTsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGaWVsZCl7CisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dCgoKEZpZWxkKSBvKS5nZXRCb2R5KCkpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBUaGUgT2JqZWN0IHNob3VsZCBiZSBhIEhlYWRlciBvciBhIFN0cmluZyBjb250YWluaW5nIGEgCisgICAgICAgICAgICAgICAgICogUHJlYW1ibGUgb3IgRXBpbG9ndWUuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChvLnRvU3RyaW5nKCkpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGRpc3BsYXlzIHRoZSBndWkuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIE1lc3NhZ2UgdG8gZGlzcGxheSBpbiB0aGUgdHJlZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNyZWF0ZUFuZFNob3dHVUkoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIENyZWF0ZSBhbmQgc2V0IHVwIHRoZSB3aW5kb3cuCisgICAgICAgICAqLworICAgICAgICBKRnJhbWUgZnJhbWUgPSBuZXcgSkZyYW1lKCJNZXNzYWdlVHJlZSIpOworICAgICAgICBmcmFtZS5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oSkZyYW1lLkVYSVRfT05fQ0xPU0UpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENyZWF0ZSBhbmQgc2V0IHVwIHRoZSBjb250ZW50IHBhbmUuCisgICAgICAgICAqLworICAgICAgICBNZXNzYWdlVHJlZSBuZXdDb250ZW50UGFuZSA9IG5ldyBNZXNzYWdlVHJlZShtZXNzYWdlKTsKKyAgICAgICAgbmV3Q29udGVudFBhbmUuc2V0T3BhcXVlKHRydWUpOworICAgICAgICBmcmFtZS5zZXRDb250ZW50UGFuZShuZXdDb250ZW50UGFuZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGlzcGxheSB0aGUgd2luZG93LgorICAgICAgICAgKi8KKyAgICAgICAgZnJhbWUucGFjaygpOworICAgICAgICBmcmFtZS5zZXRWaXNpYmxlKHRydWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnc1swXSkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBqYXZheC5zd2luZy5Td2luZ1V0aWxpdGllcy5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBjcmVhdGVBbmRTaG93R1VJKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4iKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IG9yZy5taW1lNGouc2FtcGxlcy50cmVlLk1lc3NhZ2VUcmVlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcGF0aC90by9tZXNzYWdlIik7CisgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBmaWxlICciICsgYXJnc1swXSArICInIGNvdWxkIG5vdCBiZSBmb3VuZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJUaGUgZmlsZSAnIiArIGFyZ3NbMF0gKyAiJyBjb3VsZCBub3QgYmUgcmVhZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvcG9tLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdjY2Y0YQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3BvbS54bWwKQEAgLTAsMCArMSwzNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPCEtLQorICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICAgIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKyAgLS0+CisgIDxwYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+amFtZXMtcHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgorICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KKyAgICA8IS0tIEVpdGhlciB0aGlzIHJlYWxseSBwb2ludHMgdG8gdGhlIGphbWVzLXByb2plY3QvcG9tLnhtbCBvciB5b3UKKyAgICAgICAgIHdpbGwgaGF2ZSB0byB0dW5lIHRoZSBsb2NhbCByZXBvc2l0b3J5LCBsYXRlciwgaW4gdGhpcyBmaWxlIC0tPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vamFtZXMtcHJvamVjdC9wcm9qZWN0L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5qYW1lczwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+YXBhY2hlLW1pbWU0ajwvYXJ0aWZhY3RJZD4KKyAgPG5hbWU+QXBhY2hlIEpBTUVTIE1pbWU0ajwvbmFtZT4KKyAgPHZlcnNpb24+MC42PC92ZXJzaW9uPgorICA8ZGVzY3JpcHRpb24+SmF2YSBzdHJlYW0gYmFzZWQgTUlNRSBtZXNzYWdlIHBhcnNlcjwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cDovL2phbWVzLmFwYWNoZS5vcmcvbWltZTRqPC91cmw+CisgIDxpc3N1ZU1hbmFnZW1lbnQ+CisgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTUlNRTRKPC91cmw+CisgIDwvaXNzdWVNYW5hZ2VtZW50PgorICA8aW5jZXB0aW9uWWVhcj4yMDA0PC9pbmNlcHRpb25ZZWFyPgorICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKyAgICA8c2l0ZT4KKyAgICAgIDxpZD5taW1lNGotd2Vic2l0ZTwvaWQ+CisgICAgICA8dXJsPnNjcDovL21pbm90YXVyLmFwYWNoZS5vcmcvd3d3L2phbWVzLmFwYWNoZS5vcmcvbWltZTRqLzwvdXJsPgorICAgIDwvc2l0ZT4KKyAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICA8c2NtPgorICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYW1lcy9taW1lNGovdGFncy9hcGFjaGUtbWltZTRqLTAuNjwvY29ubmVjdGlvbj4KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2phbWVzL21pbWU0ai90YWdzL2FwYWNoZS1taW1lNGotMC42PC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9qYW1lcy9taW1lNGovdGFncy9hcGFjaGUtbWltZTRqLTAuNjwvdXJsPgorICA8L3NjbT4KKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS0zPC92ZXJzaW9uPgorICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amF2YWNjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40LjE8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtamp0cmVlPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+amp0cmVlLWphdmFjYzwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1qYXZhY2M8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5qYXZhY2M8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHNvdXJjZT4ke2NvbXBpbGVTb3VyY2V9PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4ke2NvbXBpbGVTb3VyY2V9PC90YXJnZXQ+CisgICAgICAgICAgPGVuY29kaW5nPmlzbzg4NTktMTwvZW5jb2Rpbmc+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPiAgICAgIAorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICA8bWFuaWZlc3RGaWxlPiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GL01BTklGRVNULk1GPC9tYW5pZmVzdEZpbGU+CisgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICA8U3BlY2lmaWNhdGlvbi1UaXRsZT5BcGFjaGUgTWltZTRqPC9TcGVjaWZpY2F0aW9uLVRpdGxlPgorICAgICAgICAgICAgICA8U3BlY2lmaWNhdGlvbi1WZXJzaW9uPiR7cG9tLnZlcnNpb259PC9TcGVjaWZpY2F0aW9uLVZlcnNpb24+CisgICAgICAgICAgICAgIDxTcGVjaWZpY2F0aW9uLVZlbmRvcj5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L1NwZWNpZmljYXRpb24tVmVuZG9yPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVGl0bGU+QXBhY2hlIE1pbWU0ajwvSW1wbGVtZW50YXRpb24tVGl0bGU+CisgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1WZXJzaW9uPiR7cG9tLnZlcnNpb259PC9JbXBsZW1lbnRhdGlvbi1WZXJzaW9uPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVuZG9yPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvSW1wbGVtZW50YXRpb24tVmVuZG9yPgorICAgICAgICAgICAgICA8SW1wbGVtZW50YXRpb24tVmVuZG9yLUlkPm9yZy5hcGFjaGU8L0ltcGxlbWVudGF0aW9uLVZlbmRvci1JZD4KKyAgICAgICAgICAgICAgPHVybD4ke3BvbS51cmx9PC91cmw+CisgICAgICAgICAgICA8L21hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5jcmVhdGUtamF2YWRvY3M8L2lkPiA8IS0tIHRoaXMgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UgbWVyZ2VzIC0tPgorICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPiA8IS0tIGFwcGVuZCB0byB0aGUgcGFja2FnaW5nIHBoYXNlLiAtLT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+amF2YWRvYzwvZ29hbD4gPCEtLSBnb2FscyA9PSBtb2pvcyAtLT4KKyAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPiA8IS0tIGdvYWxzID09IG1vam9zIC0tPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZXhjbHVkZVBhY2thZ2VOYW1lcz5vcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLnBhcnNlcjpvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5jb250ZW50ZGlzcG9zaXRpb24ucGFyc2VyOm9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmNvbnRlbnR0eXBlLnBhcnNlcjpvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5kYXRldGltZS5wYXJzZXI6b3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQubGFuZ3VhZ2UucGFyc2VyOm9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLm1pbWV2ZXJzaW9uLnBhcnNlcjpvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5zdHJ1Y3R1cmVkLnBhcnNlcjwvZXhjbHVkZVBhY2thZ2VOYW1lcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8IS0tIEFkZCBOT1RJQ0UgYW5kIExJQ0VOU0UgdG8gZ2VuZXJhdGVkIEpBUiAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnByb2Nlc3M8L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxyZXNvdXJjZUJ1bmRsZXM+CisgICAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlPm9yZy5hcGFjaGU6YXBhY2hlLWphci1yZXNvdXJjZS1idW5kbGU6MS40PC9yZXNvdXJjZUJ1bmRsZT4KKyAgICAgICAgICAgICAgPC9yZXNvdXJjZUJ1bmRsZXM+CisgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorCSAgICAgICAgICAgICAgPGFkZExpY2Vuc2U+dHJ1ZTwvYWRkTGljZW5zZT4KKyAgICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgCTxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAJPHZlcnNpb24+Mi4wLjQ8L3ZlcnNpb24+CisgICAgICAJPGV4ZWN1dGlvbnM+CisgICAgICAJCTxleGVjdXRpb24+CisgICAgICAJCQk8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgorICAgICAgCQkJPGdvYWxzPgorICAgICAgCQkJCTxnb2FsPmphcjwvZ29hbD4KKyAgICAgIAkJCTwvZ29hbHM+CisgICAgICAJCTwvZXhlY3V0aW9uPgorICAgICAgCTwvZXhlY3V0aW9ucz4KKyAgICAgIDwvcGx1Z2luPgorCisgICAgICA8IS0tCisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgPC9wbHVnaW4+CisgICAgICAtLT4KKyAgICAgIDxwbHVnaW4+CisgICAgICAJPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgIAk8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgCTx2ZXJzaW9uPjEuNC4zPC92ZXJzaW9uPgorICAgICAgCTxleGVjdXRpb25zPgorICAgICAgCQk8ZXhlY3V0aW9uPgorICAgICAgCQkJPGlkPmJ1bmRsZS1tYW5pZmVzdDwvaWQ+CisgICAgICAJCQk8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KKyAgICAgIAkJCTxnb2Fscz4KKyAgICAgIAkJCQk8Z29hbD5tYW5pZmVzdDwvZ29hbD4KKyAgICAgIAkJCTwvZ29hbHM+CisgICAgICAJCTwvZXhlY3V0aW9uPgorICAgICAgCTwvZXhlY3V0aW9ucz4KKyAgICAgIAk8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgCTxjb25maWd1cmF0aW9uPgorICAgICAgCQk8aW5zdHJ1Y3Rpb25zPgorICAgICAgCQkJPEV4cG9ydC1QYWNrYWdlPm9yZy5hcGFjaGUuamFtZXMubWltZTRqLio8L0V4cG9ydC1QYWNrYWdlPgorICAgICAgCQkJPEVtYmVkLURlcGVuZGVuY3k+KjtzY29wZT1ydW50aW1lPC9FbWJlZC1EZXBlbmRlbmN5PgorICAgICAgCQk8L2luc3RydWN0aW9ucz4KKyAgICAgIAk8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yLWJldGEtMjwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGRlc2NyaXB0b3JTb3VyY2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvYXNzZW1ibGUvPC9kZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5PgorICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+Z251PC90YXJMb25nRmlsZU1vZGU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5tYWtlLWFzc2VtYmx5PC9pZD4gPCEtLSB0aGlzIGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlIG1lcmdlcyAtLT4KKyAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4gPCEtLSBhcHBlbmQgdG8gdGhlIHBhY2thZ2luZyBwaGFzZS4gLS0+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPiA8IS0tIGdvYWxzID09IG1vam9zIC0tPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorICA8cmVwb3NpdG9yaWVzPgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmxvY2FsLW1pbWU0ai1zdGFnZS1yZXBvc2l0b3J5PC9pZD4KKyAgICAgIDxuYW1lPkxvY2FsIG1pbWU0aiBzdGFnZSByZXBvc2l0b3J5PC9uYW1lPgorICAgICAgPCEtLSBQbGVhc2Ugbm90ZSB0aGF0IGR1ZSB0byBodHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL01ORy0yODk2IC0tPgorICAgICAgPCEtLSBJZiB5b3UgZG9uJ3QgaGF2ZSBqYW1lcy1wcm9qZWN0IGNoZWNrZWQgb3V0IGluIC4uL2phbWVzLXByb2plY3QgLS0+CisgICAgICA8IS0tIHlvdSB3aWxsIGhhdmUgdG8gcGxhY2UgeW91ciBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IGluc3RlYWQgLS0+CisgICAgICA8IS0tIG9mICR7YmFzZWRpcn0sIG9yLCBvdGhlcndpc2UsIG1hbnVhbGx5IGluc3RhbGwgdGhlIHBhcmVudCBwb21zIC0tPgorICAgICAgPCEtLQorICAgICAgICAgICBtdm4gLWZpZ25vcmVwb20ueG1sIGluc3RhbGw6aW5zdGFsbC1maWxlIAorICAgICAgICAgICAgICAtRGZpbGU9c3RhZ2Vcb3JnLmFwYWNoZS5qYW1lc1xwb21zXGphbWVzLXBhcmVudC0xLjEucG9tIAorICAgICAgICAgICAgICAtRHBhY2thZ2luZz1wb20gCisgICAgICAgICAgICAgIC1EZ3JvdXBJZD1vcmcuYXBhY2hlLmphbWVzIAorICAgICAgICAgICAgICAtRGFydGlmYWN0SWQ9amFtZXMtcGFyZW50IAorICAgICAgICAgICAgICAtRHZlcnNpb249MS4xCisgICAgICAgICAgIG12biAtZmlnbm9yZXBvbS54bWwgaW5zdGFsbDppbnN0YWxsLWZpbGUgCisgICAgICAgICAgICAgIC1EZmlsZT1zdGFnZVxvcmcuYXBhY2hlLmphbWVzXHBvbXNcamFtZXMtcHJvamVjdC0xLjIucG9tIAorICAgICAgICAgICAgICAtRHBhY2thZ2luZz1wb20gCisgICAgICAgICAgICAgIC1EZ3JvdXBJZD1vcmcuYXBhY2hlLmphbWVzIAorICAgICAgICAgICAgICAtRGFydGlmYWN0SWQ9amFtZXMtcHJvamVjdCAKKyAgICAgICAgICAgICAgLUR2ZXJzaW9uPTEuMgorICAgICAgIC0tPgorICAgICAgPHVybD5maWxlOi8vJHtiYXNlZGlyfS9zdGFnZTwvdXJsPgorICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KKyAgICAgIDxzbmFwc2hvdHM+CisgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+CisgICAgICAgIDxjaGVja3N1bVBvbGljeT5pZ25vcmU8L2NoZWNrc3VtUG9saWN5PgorICAgICAgPC9zbmFwc2hvdHM+CisgICAgICA8cmVsZWFzZXM+CisgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+CisgICAgICAgIDxjaGVja3N1bVBvbGljeT5pZ25vcmU8L2NoZWNrc3VtUG9saWN5PgorICAgICAgPC9yZWxlYXNlcz4KKyAgICA8L3JlcG9zaXRvcnk+CisgIDwvcmVwb3NpdG9yaWVzPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4xNDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+CisgICAgICA8dHlwZT5qYXI8L3R5cGU+CisgICAgICA8IS0tICBSZW1vdmVkIGFzIGEgd29ya2Fyb3VuZCBmb3IgYW4gdW5pZGVudGlmaWVkIE0yIGJ1ZyAtLT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorCisgIDxyZXBvcnRpbmc+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoYW5nZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDxvbmx5Q3VycmVudFZlcnNpb24+dHJ1ZTwvb25seUN1cnJlbnRWZXJzaW9uPgorICAgICAgICAgICAgPHJlc29sdXRpb25JZHM+Q2xvc2VkPC9yZXNvbHV0aW9uSWRzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgIDxyZXBvcnRTZXRzPgorICAgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgICAgICA8cmVwb3J0cz4KKyAgICAgICAgICAgICAgICAgICAgPHJlcG9ydD5qaXJhLXJlcG9ydDwvcmVwb3J0PgorICAgICAgICAgICAgICAgIDwvcmVwb3J0cz4KKyAgICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40LjM8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXJlcG9ydC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgorICAgICAgPC9wbHVnaW4+IAorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8dGFyZ2V0SmRrPiR7Y29tcGlsZVNvdXJjZX08L3RhcmdldEpkaz4KKyAgICAgICAgICA8cnVsZXNldHM+CisgICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvYmFzaWMueG1sPC9ydWxlc2V0PgorICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2NvbnRyb3ZlcnNpYWwueG1sPC9ydWxlc2V0PgorICAgICAgICAgIDwvcnVsZXNldHM+CisgICAgICAgICAgPGZvcm1hdD54bWw8L2Zvcm1hdD4KKyAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+CisgICAgICAgICAgPHNvdXJjZUVuY29kaW5nPnV0Zi04PC9zb3VyY2VFbmNvZGluZz4KKyAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4wLWJldGEtNzwvdmVyc2lvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnJhdC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS0zPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICA8IS0tIHRlc3QgcmVzb3VyY2VzIGNyZWF0ZWQgYnkgSkFNRVMgY29tbWl0dGVycyAvIHdlIGNhbid0IGluY2x1ZGUgQUx2MiBoZWFkZXJzIHRoZXJlIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5iZW5jaG1hcmtzL3Jlc291cmNlcy8qLm1zZzwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwhLS0gM3JkIHBhcnR5IGRlc2NyaXB0b3JzIGRpc3RyaWJ1dGVkIHZpYSBtYXZlbiByZXBvc2l0b3JpZXMKKyAgICAgICAgICAgICAgICAgYW5kIGluY2x1ZGVkICJhcyBpcyIgLS0+CisgICAgICAgICAgICA8ZXhjbHVkZT5zdGFnZS9jb21tb25zLWlvL3BvbXMvY29tbW9ucy1pby0xLjIucG9tPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c3RhZ2UvY29tbW9ucy1sb2dnaW5nL3BvbXMvY29tbW9ucy1sb2dnaW5nLTEuMS5wb208L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5zdGFnZS9vcmcuYXBhY2hlLmphbWVzL3htbHMvamFtZXMtcGFyZW50LTEuMS1zaXRlLnhtbDwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPnN0YWdlL29yZy5hcGFjaGUuamFtZXMveG1scy9qYW1lcy1wYXJlbnQtMS4xLXNpdGVfZW4ueG1sPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy94bWxzL2phbWVzLXByb2plY3QtMS4yLXNpdGUueG1sPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+c3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy94bWxzL2phbWVzLXByb2plY3QtMS4yLXNpdGVfZW4ueG1sPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+cmVsZWFzZS5wcm9wZXJ0aWVzPC9leGNsdWRlPgorICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnRhZ2xpc3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhY2MtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjQuMTwvdmVyc2lvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9yZXBvcnRpbmc+CisKKyAgPG1haWxpbmdMaXN0cz4KKyAgICA8bWFpbGluZ0xpc3Q+CisgICAgICAgICAgICA8bmFtZT5BcGFjaGUgTWltZTRqIExpc3RzPC9uYW1lPgorICAgICAgICAgICAgPHN1YnNjcmliZT5taW1lNGotZGV2LXN1YnNjcmliZUBqYW1lcy5hcGFjaGUub3JnPC9zdWJzY3JpYmU+CisgICAgICAgICAgICA8dW5zdWJzY3JpYmU+bWltZTRqLWRldi11bnN1YnNjcmliZUBqYW1lcy5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KKyAgICAgICAgICAgIDxwb3N0Pm1pbWU0ai1kZXZAamFtZXMuYXBhY2hlLm9yZzwvcG9zdD4KKyAgICAgICAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvamFtZXMtbWltZTRqLWRldi88L2FyY2hpdmU+CisgICAgPC9tYWlsaW5nTGlzdD4KKyAgPC9tYWlsaW5nTGlzdHM+CisgIAorICA8cHJvcGVydGllcz4KKyAgICA8Y29tcGlsZVNvdXJjZT4xLjU8L2NvbXBpbGVTb3VyY2U+CisgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwY2JhOAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9hc3NlbWJsZS9iaW4ueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzxhc3NlbWJseT4NCisgIDwhLS0NCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICANCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAgDQorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICBkaXN0cmlidXRlZCAgdW5kZXIgdGhlICBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICBXSVRIT1VUICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgIE9GIEFOWSBLSU5ELCBlaXRoZXIgIGV4cHJlc3MgIG9yDQorICBpbXBsaWVkLg0KKyAgDQorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgIC0tPg0KKyAgPGlkPmJpbjwvaWQ+DQorICA8IS0tIA0KKyAgR2VuZXJhdGVzIGEgamFyIGZpbGUgaW5jbHVkaW5nIHRoZSBiaW5hcnkgamFyIGFuZCB0aGUgcnVudGltZSBkZXBlbmRlbmNpZXMuDQorICBpbmNsdWRpbmcgTk9USUNFIGFuZCBMSUNFTlNFIGluIHRoZSByb290Lg0KKyAgLS0+DQorICA8Zm9ybWF0cz4NCisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCisgICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4NCisgIDwvZm9ybWF0cz4NCisgIDxmaWxlU2V0cz4NCisgICAgPGZpbGVTZXQ+DQorICAgICAgPGRpcmVjdG9yeT50YXJnZXQvbWF2ZW4tc2hhcmVkLWFyY2hpdmUtcmVzb3VyY2VzL01FVEEtSU5GLzwvZGlyZWN0b3J5Pg0KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICAgIDxpbmNsdWRlcz4NCisgICAgICAgIDxpbmNsdWRlPio8L2luY2x1ZGU+DQorICAgICAgPC9pbmNsdWRlcz4NCisgICAgPC9maWxlU2V0Pg0KKyAgICA8ZmlsZVNldD4NCisgICAgICA8aW5jbHVkZXM+DQorICAgICAgICA8aW5jbHVkZT5SRUxFQVNFX05PVEVTLnR4dDwvaW5jbHVkZT4NCisgICAgICA8L2luY2x1ZGVzPg0KKyAgICA8L2ZpbGVTZXQ+DQorICAgIDxmaWxlU2V0Pg0KKyAgICAgIDxkaXJlY3Rvcnk+ZXhhbXBsZXM8L2RpcmVjdG9yeT4NCisgICAgPC9maWxlU2V0Pg0KKyAgICA8ZmlsZVNldD4NCisgICAgICA8ZGlyZWN0b3J5PnRhcmdldDwvZGlyZWN0b3J5Pg0KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+DQorICAgICAgPGluY2x1ZGVzPg0KKyAgICAgICAgPGluY2x1ZGU+JHthcnRpZmFjdElkfS0ke3ZlcnNpb259LmphcjwvaW5jbHVkZT4NCisgICAgICA8L2luY2x1ZGVzPg0KKyAgICA8L2ZpbGVTZXQ+DQorICAgIDxmaWxlU2V0Pg0KKyAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L2FwaWRvY3M8L2RpcmVjdG9yeT4NCisgICAgICA8b3V0cHV0RGlyZWN0b3J5PmphdmFkb2NzPC9vdXRwdXREaXJlY3Rvcnk+DQorICAgIDwvZmlsZVNldD4NCisgIDwvZmlsZVNldHM+DQorICA8ZGVwZW5kZW5jeVNldHM+DQorICAgIDxkZXBlbmRlbmN5U2V0Pg0KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2xpYi88L291dHB1dERpcmVjdG9yeT4NCisgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PmZhbHNlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+DQorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KKyAgICA8L2RlcGVuZGVuY3lTZXQ+DQorICA8L2RlcGVuZGVuY3lTZXRzPg0KKzwvYXNzZW1ibHk+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL2Fzc2VtYmxlL3NyYy54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvYXNzZW1ibGUvc3JjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QxZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL2Fzc2VtYmxlL3NyYy54bWwKQEAgLTAsMCArMSw0MyBAQAorPGFzc2VtYmx5Pg0KKyAgPCEtLQ0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlDQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wDQorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgIA0KKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICANCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisgIGRpc3RyaWJ1dGVkICB1bmRlciB0aGUgIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgIFdJVEhPVVQgIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyAgT0YgQU5ZIEtJTkQsIGVpdGhlciAgZXhwcmVzcyAgb3INCisgIGltcGxpZWQuDQorICANCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAgLS0+DQorICA8aWQ+c3JjPC9pZD4NCisgIDwhLS0gDQorICBHZW5lcmF0ZXMgYSBmaWxlIGluY2x1ZGluZyBhbGwgdGhlIHNvdXJjZSB0cmVlIGV4Y2x1ZGluZyBmaWxlcy9mb2xkZXJzDQorICBzdGFydGluZyB3aXRoICIuIiAsICouYmFrIGFuZCB0aGUgdGFyZ2V0DQorICAtLT4NCisgIDxmb3JtYXRzPg0KKyAgICA8Zm9ybWF0PnppcDwvZm9ybWF0Pg0KKyAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0Pg0KKyAgPC9mb3JtYXRzPg0KKyAgPGZpbGVTZXRzPg0KKyAgICA8ZmlsZVNldD4NCisgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4NCisgICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5Pg0KKyAgICAgIDxleGNsdWRlcz4NCisgICAgICAgIDxleGNsdWRlPioqL3RhcmdldC8qKjwvZXhjbHVkZT4NCisgICAgICAgIDxleGNsdWRlPi4qPC9leGNsdWRlPg0KKyAgICAgICAgPGV4Y2x1ZGU+LiovKio8L2V4Y2x1ZGU+DQorICAgICAgICA8ZXhjbHVkZT4qKi5iYWs8L2V4Y2x1ZGU+DQorICAgICAgICA8ZXhjbHVkZT5saWIvKio8L2V4Y2x1ZGU+DQorICAgICAgPC9leGNsdWRlcz4NCisgICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4NCisgICAgPC9maWxlU2V0Pg0KKyAgPC9maWxlU2V0cz4NCis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL3N1cHBsZW1lbnRhbC1tb2RlbHMueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vYXBwZW5kZWQtcmVzb3VyY2VzL3N1cHBsZW1lbnRhbC1tb2RlbHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTNmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9hcHBlbmRlZC1yZXNvdXJjZXMvc3VwcGxlbWVudGFsLW1vZGVscy54bWwKQEAgLTAsMCArMSw5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCis8c3VwcGxlbWVudGFsRGF0YU1vZGVscz4NCisgIDwhLS0NCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoDQorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgNCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICANCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAgDQorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICBkaXN0cmlidXRlZCAgdW5kZXIgdGhlICBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorICBXSVRIT1VUICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgIE9GIEFOWSBLSU5ELCBlaXRoZXIgIGV4cHJlc3MgIG9yDQorICBpbXBsaWVkLg0KKyAgDQorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4NCisgIC0tPg0KKyAgPHN1cHBsZW1lbnQ+DQorICAgIDxwcm9qZWN0Pg0KKyAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4NCisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+DQorICAgICAgPG5hbWU+QXBhY2hlIENvbW1vbnMgTG9nZ2luZzwvbmFtZT4NCisgICAgICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9sb2dnaW5nLzwvdXJsPg0KKyAgICAgIDxvcmdhbml6YXRpb24+DQorICAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+DQorICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4NCisgICAgICA8L29yZ2FuaXphdGlvbj4NCisgICAgICA8bGljZW5zZXM+DQorICAgICAgICA8bGljZW5zZT4NCisgICAgICAgICAgPG5hbWU+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPg0KKyAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC91cmw+DQorICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPg0KKyAgICAgICAgPC9saWNlbnNlPg0KKyAgICAgIDwvbGljZW5zZXM+DQorICAgIDwvcHJvamVjdD4NCisgIDwvc3VwcGxlbWVudD4NCisgIDxzdXBwbGVtZW50Pg0KKyAgICA8cHJvamVjdD4NCisgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+DQorICAgICAgPG5hbWU+QXBhY2hlIENvbW1vbnMgSU88L25hbWU+DQorICAgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvaW8vPC91cmw+DQorICAgICAgPG9yZ2FuaXphdGlvbj4NCisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4NCisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPg0KKyAgICAgIDwvb3JnYW5pemF0aW9uPg0KKyAgICAgIDxsaWNlbnNlcz4NCisgICAgICAgIDxsaWNlbnNlPg0KKyAgICAgICAgICA8bmFtZT5BcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+DQorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L3VybD4NCisgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+DQorICAgICAgICA8L2xpY2Vuc2U+DQorICAgICAgPC9saWNlbnNlcz4NCisgICAgPC9wcm9qZWN0Pg0KKyAgPC9zdXBwbGVtZW50Pg0KKyAgPHN1cHBsZW1lbnQ+DQorICAgIDxwcm9qZWN0Pg0KKyAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPg0KKyAgICAgIDxuYW1lPkFwYWNoZSBMb2c0ajwvbmFtZT4NCisgICAgICA8dXJsPmh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovPC91cmw+DQorICAgICAgPG9yZ2FuaXphdGlvbj4NCisgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4NCisgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPg0KKyAgICAgIDwvb3JnYW5pemF0aW9uPg0KKyAgICAgIDxsaWNlbnNlcz4NCisgICAgICAgIDxsaWNlbnNlPg0KKyAgICAgICAgICA8bmFtZT5BcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+DQorICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L3VybD4NCisgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+DQorICAgICAgICA8L2xpY2Vuc2U+DQorICAgICAgPC9saWNlbnNlcz4NCisgICAgPC9wcm9qZWN0Pg0KKyAgPC9zdXBwbGVtZW50Pg0KKyAgPHN1cHBsZW1lbnQ+DQorICAgIDxwcm9qZWN0Pg0KKyAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPg0KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPg0KKyAgICAgIDxuYW1lPkpVbml0PC9uYW1lPg0KKyAgICAgIDx1cmw+aHR0cDovL3d3dy5qdW5pdC5vcmcvPC91cmw+DQorICAgICAgPG9yZ2FuaXphdGlvbj4NCisgICAgICAJPG5hbWU+S2VudCBCZWNrLCBFcmljaCBHYW1tYSwgYW5kIERhdmlkIFNhZmY8L25hbWU+DQorICAgICAgPC9vcmdhbml6YXRpb24+DQorICAgICAgPGxpY2Vuc2VzPg0KKyAgICAgICAgPGxpY2Vuc2U+DQorICAgICAgICAgIDxuYW1lPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMDwvbmFtZT4NCisgICAgICAgICAgPHVybD5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2NwbC5waHA8L3VybD4NCisgICAgICAgIDwvbGljZW5zZT4NCisgICAgICA8L2xpY2Vuc2VzPg0KKyAgICA8L3Byb2plY3Q+DQorICA8L3N1cHBsZW1lbnQ+DQorPC9zdXBwbGVtZW50YWxEYXRhTW9kZWxzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovTWltZUV4Y2VwdGlvbi5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9NaW1lRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzZGY2YwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovTWltZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGo7CisKKy8qKgorICogTUlNRSBwcm9jZXNzaW5nIGV4Y2VwdGlvbi4KKyAqLworcHVibGljIGNsYXNzIE1pbWVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gODM1MjgyMTI3ODcxNDE4ODU0Mkw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE1JTUUgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIGRldGFpbCBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIE1pbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIE1JTUUgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBjYXVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXVzZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE1pbWVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIE1JTUUgZXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZSBhbmQgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBkZXRhaWwgbWVzc2FnZQorICAgICAqIEBwYXJhbSBjYXVzZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIE1pbWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgaW5pdENhdXNlKGNhdXNlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovTWltZUlPRXhjZXB0aW9uLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL01pbWVJT0V4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjNkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL01pbWVJT0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGo7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEEgd3JhcHBlciBjbGFzcyBiYXNlZCBvbiB7QGxpbmsgSU9FeGNlcHRpb259IGZvciBNSU1FIHByb3RvY29sIGV4Y2VwdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBNaW1lSU9FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MzkzNjEzNDU5NTMzNzM1NDA5TDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgTWltZUlPRXhjZXB0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgZGV0YWlsIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIE1pbWVJT0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzKG5ldyBNaW1lRXhjZXB0aW9uKG1lc3NhZ2UpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIElPIGV4Y2VwdGlvbiBiYXNlZCBvbiB7QGxpbmsgTWltZUV4Y2VwdGlvbn0uCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2UuCisgICAgICovCisgICAgcHVibGljIE1pbWVJT0V4Y2VwdGlvbihNaW1lRXhjZXB0aW9uIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIGluaXRDYXVzZShjYXVzZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0Jhc2U2NElucHV0U3RyZWFtLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0Jhc2U2NElucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWJmNDBkYQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvQmFzZTY0SW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDI4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWM7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCisNCisvKioNCisgKiBQZXJmb3JtcyBCYXNlLTY0IGRlY29kaW5nIG9uIGFuIHVuZGVybHlpbmcgc3RyZWFtLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBCYXNlNjRJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJhc2U2NElucHV0U3RyZWFtLmNsYXNzKTsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERURfQlVGRkVSX1NJWkUgPSAxNTM2Ow0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBCQVNFNjRfREVDT0RFID0gbmV3IGludFsyNTZdOw0KKw0KKyAgICBzdGF0aWMgew0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykNCisgICAgICAgICAgICBCQVNFNjRfREVDT0RFW2ldID0gLTE7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJhc2U2NE91dHB1dFN0cmVhbS5CQVNFNjRfVEFCTEUubGVuZ3RoOyBpKyspDQorICAgICAgICAgICAgQkFTRTY0X0RFQ09ERVtCYXNlNjRPdXRwdXRTdHJlYW0uQkFTRTY0X1RBQkxFW2ldICYgMHhmZl0gPSBpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQkFTRTY0X1BBRCA9ICc9JzsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVPRiA9IC0xOw0KKw0KKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBzaW5nbGVCeXRlID0gbmV3IGJ5dGVbMV07DQorDQorICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpY3Q7DQorDQorICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW47DQorICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gZW5jb2RlZCA9IG5ldyBieXRlW0VOQ09ERURfQlVGRkVSX1NJWkVdOw0KKyAgICBwcml2YXRlIGludCBwb3NpdGlvbiA9IDA7IC8vIGN1cnJlbnQgaW5kZXggaW50byBlbmNvZGVkIGJ1ZmZlcg0KKyAgICBwcml2YXRlIGludCBzaXplID0gMDsgLy8gY3VycmVudCBzaXplIG9mIGVuY29kZWQgYnVmZmVyDQorDQorICAgIHByaXZhdGUgZmluYWwgQnl0ZVF1ZXVlIHEgPSBuZXcgQnl0ZVF1ZXVlKCk7DQorDQorICAgIHByaXZhdGUgYm9vbGVhbiBlb2Y7IC8vIGVuZCBvZiBmaWxlIG9yIHBhZCBjaGFyYWN0ZXIgcmVhY2hlZA0KKw0KKyAgICBwdWJsaWMgQmFzZTY0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsNCisgICAgICAgIHRoaXMoaW4sIGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQmFzZTY0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gc3RyaWN0KSB7DQorICAgICAgICBpZiAoaW4gPT0gbnVsbCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorDQorICAgICAgICB0aGlzLmluID0gaW47DQorICAgICAgICB0aGlzLnN0cmljdCA9IHN0cmljdDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGlmIChjbG9zZWQpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJCYXNlNjRJbnB1dFN0cmVhbSBoYXMgYmVlbiBjbG9zZWQiKTsNCisNCisgICAgICAgIHdoaWxlICh0cnVlKSB7DQorICAgICAgICAgICAgaW50IGJ5dGVzID0gcmVhZDAoc2luZ2xlQnl0ZSwgMCwgMSk7DQorICAgICAgICAgICAgaWYgKGJ5dGVzID09IEVPRikNCisgICAgICAgICAgICAgICAgcmV0dXJuIEVPRjsNCisNCisgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gMSkNCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpbmdsZUJ5dGVbMF0gJiAweGZmOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGlmIChjbG9zZWQpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJCYXNlNjRJbnB1dFN0cmVhbSBoYXMgYmVlbiBjbG9zZWQiKTsNCisNCisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsNCisNCisgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID09IDApDQorICAgICAgICAgICAgcmV0dXJuIDA7DQorDQorICAgICAgICByZXR1cm4gcmVhZDAoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoY2xvc2VkKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQmFzZTY0SW5wdXRTdHJlYW0gaGFzIGJlZW4gY2xvc2VkIik7DQorDQorICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpDQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7DQorDQorICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBsZW5ndGggPCAwIHx8IG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpDQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsNCisNCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkNCisgICAgICAgICAgICByZXR1cm4gMDsNCisNCisgICAgICAgIHJldHVybiByZWFkMChidWZmZXIsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKGNsb3NlZCkNCisgICAgICAgICAgICByZXR1cm47DQorDQorICAgICAgICBjbG9zZWQgPSB0cnVlOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgaW50IHJlYWQwKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBmcm9tLCBmaW5hbCBpbnQgdG8pDQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGludCBpbmRleCA9IGZyb207IC8vIGluZGV4IGludG8gZ2l2ZW4gYnVmZmVyDQorDQorICAgICAgICAvLyBjaGVjayBpZiBhIHByZXZpb3VzIGludm9jYXRpb24gbGVmdCBkZWNvZGVkIGJ5dGVzIGluIHRoZSBxdWV1ZQ0KKw0KKyAgICAgICAgaW50IHFDb3VudCA9IHEuY291bnQoKTsNCisgICAgICAgIHdoaWxlIChxQ291bnQtLSA+IDAgJiYgaW5kZXggPCB0bykgew0KKyAgICAgICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IHEuZGVxdWV1ZSgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gZW9mIG9yIHBhZCByZWFjaGVkPw0KKw0KKyAgICAgICAgaWYgKGVvZikNCisgICAgICAgICAgICByZXR1cm4gaW5kZXggPT0gZnJvbSA/IEVPRiA6IGluZGV4IC0gZnJvbTsNCisNCisgICAgICAgIC8vIGRlY29kZSBpbnRvIGdpdmVuIGJ1ZmZlcg0KKw0KKyAgICAgICAgaW50IGRhdGEgPSAwOyAvLyBob2xkcyBkZWNvZGVkIGRhdGE7IHVwIHRvIGZvdXIgc2V4dGV0cw0KKyAgICAgICAgaW50IHNleHRldHMgPSAwOyAvLyBudW1iZXIgb2Ygc2V4dGV0cw0KKw0KKyAgICAgICAgd2hpbGUgKGluZGV4IDwgdG8pIHsNCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYnVmZmVyIG5vdCBlbXB0eQ0KKw0KKyAgICAgICAgICAgIHdoaWxlIChwb3NpdGlvbiA9PSBzaXplKSB7DQorICAgICAgICAgICAgICAgIGludCBuID0gaW4ucmVhZChlbmNvZGVkLCAwLCBlbmNvZGVkLmxlbmd0aCk7DQorICAgICAgICAgICAgICAgIGlmIChuID09IEVPRikgew0KKyAgICAgICAgICAgICAgICAgICAgZW9mID0gdHJ1ZTsNCisNCisgICAgICAgICAgICAgICAgICAgIGlmIChzZXh0ZXRzICE9IDApIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBpbiBlbmNvZGVkIGRhdGENCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVbmV4cGVjdGVkRW9mKHNleHRldHMpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09IGZyb20gPyBFT0YgOiBpbmRleCAtIGZyb207DQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobiA+IDApIHsNCisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gMDsNCisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBuOw0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG4gPT0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAvLyBkZWNvZGUgYnVmZmVyDQorDQorICAgICAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc2l6ZSAmJiBpbmRleCA8IHRvKSB7DQorICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IGVuY29kZWRbcG9zaXRpb24rK10gJiAweGZmOw0KKw0KKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gQkFTRTY0X1BBRCkgew0KKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBkZWNvZGVQYWQoZGF0YSwgc2V4dGV0cywgYnVmZmVyLCBpbmRleCwgdG8pOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4IC0gZnJvbTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBpbnQgZGVjb2RlZCA9IEJBU0U2NF9ERUNPREVbdmFsdWVdOw0KKyAgICAgICAgICAgICAgICBpZiAoZGVjb2RlZCA8IDApIC8vIC0xOiBub3QgYSBiYXNlNjQgY2hhcg0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQorDQorICAgICAgICAgICAgICAgIGRhdGEgPSAoZGF0YSA8PCA2KSB8IGRlY29kZWQ7DQorICAgICAgICAgICAgICAgIHNleHRldHMrKzsNCisNCisgICAgICAgICAgICAgICAgaWYgKHNleHRldHMgPT0gNCkgew0KKyAgICAgICAgICAgICAgICAgICAgc2V4dGV0cyA9IDA7DQorDQorICAgICAgICAgICAgICAgICAgICBieXRlIGIxID0gKGJ5dGUpIChkYXRhID4+PiAxNik7DQorICAgICAgICAgICAgICAgICAgICBieXRlIGIyID0gKGJ5dGUpIChkYXRhID4+PiA4KTsNCisgICAgICAgICAgICAgICAgICAgIGJ5dGUgYjMgPSAoYnl0ZSkgZGF0YTsNCisNCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IHRvIC0gMikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGIxOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGIyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGIzOw0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCB0byAtIDEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2luZGV4KytdID0gYjE7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGIyOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmVucXVldWUoYjMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCB0bykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbaW5kZXgrK10gPSBiMTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbnF1ZXVlKGIyKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS5lbnF1ZXVlKGIzKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmVucXVldWUoYjEpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmVucXVldWUoYjIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLmVucXVldWUoYjMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaW5kZXggPT0gdG87DQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvIC0gZnJvbTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGFzc2VydCBzZXh0ZXRzID09IDA7DQorICAgICAgICBhc3NlcnQgaW5kZXggPT0gdG87DQorICAgICAgICByZXR1cm4gdG8gLSBmcm9tOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgaW50IGRlY29kZVBhZChpbnQgZGF0YSwgaW50IHNleHRldHMsIGZpbmFsIGJ5dGVbXSBidWZmZXIsDQorICAgICAgICAgICAgaW50IGluZGV4LCBmaW5hbCBpbnQgZW5kKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgZW9mID0gdHJ1ZTsNCisNCisgICAgICAgIGlmIChzZXh0ZXRzID09IDIpIHsNCisgICAgICAgICAgICAvLyBvbmUgYnl0ZSBlbmNvZGVkIGFzICJYWT09Ig0KKw0KKyAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKSAoZGF0YSA+Pj4gNCk7DQorICAgICAgICAgICAgaWYgKGluZGV4IDwgZW5kKSB7DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGI7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcS5lbnF1ZXVlKGIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gZWxzZSBpZiAoc2V4dGV0cyA9PSAzKSB7DQorICAgICAgICAgICAgLy8gdHdvIGJ5dGVzIGVuY29kZWQgYXMgIlhZWj0iDQorDQorICAgICAgICAgICAgYnl0ZSBiMSA9IChieXRlKSAoZGF0YSA+Pj4gMTApOw0KKyAgICAgICAgICAgIGJ5dGUgYjIgPSAoYnl0ZSkgKChkYXRhID4+PiAyKSAmIDB4RkYpOw0KKw0KKyAgICAgICAgICAgIGlmIChpbmRleCA8IGVuZCAtIDEpIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyW2luZGV4KytdID0gYjE7DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGIyOw0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPCBlbmQpIHsNCisgICAgICAgICAgICAgICAgYnVmZmVyW2luZGV4KytdID0gYjE7DQorICAgICAgICAgICAgICAgIHEuZW5xdWV1ZShiMik7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgcS5lbnF1ZXVlKGIxKTsNCisgICAgICAgICAgICAgICAgcS5lbnF1ZXVlKGIyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIC8vIGVycm9yIGluIGVuY29kZWQgZGF0YQ0KKyAgICAgICAgICAgIGhhbmRsZVVuZXhwZWNlZFBhZChzZXh0ZXRzKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBpbmRleDsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlVW5leHBlY3RlZEVvZihpbnQgc2V4dGV0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGlmIChzdHJpY3QpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgbG9nLndhcm4oInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGU7IGRyb3BwaW5nICIgKyBzZXh0ZXRzDQorICAgICAgICAgICAgICAgICAgICArICIgc2V4dGV0KHMpIik7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVVuZXhwZWNlZFBhZChpbnQgc2V4dGV0cykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGlmIChzdHJpY3QpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHBhZGRpbmcgY2hhcmFjdGVyIik7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgbG9nLndhcm4oInVuZXhwZWN0ZWQgcGFkZGluZyBjaGFyYWN0ZXI7IGRyb3BwaW5nICIgKyBzZXh0ZXRzDQorICAgICAgICAgICAgICAgICAgICArICIgc2V4dGV0KHMpIik7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9CYXNlNjRPdXRwdXRTdHJlYW0uamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvQmFzZTY0T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4YzhkOQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvQmFzZTY0T3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwzMjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuU2V0Ow0KKw0KKy8qKg0KKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBzZWN0aW9uIDxjaXRlPjYuOC4gQmFzZTY0IENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc8L2NpdGU+DQorICogZnJvbSBSRkMgMjA0NSA8Y2l0ZT5NdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbCBFeHRlbnNpb25zIChNSU1FKSBQYXJ0IE9uZToNCisgKiBGb3JtYXQgb2YgSW50ZXJuZXQgTWVzc2FnZSBCb2RpZXM8L2NpdGU+IGJ5IEZyZWVkIGFuZCBCb3JlbnN0ZWluLg0KKyAqIDxwPg0KKyAqIENvZGUgaXMgYmFzZWQgb24gQmFzZTY0IGFuZCBCYXNlNjRPdXRwdXRTdHJlYW0gY29kZSBmcm9tIENvbW1vbnMtQ29kZWMgMS40Lg0KKyAqIA0KKyAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0NS50eHQiPlJGQyAyMDQ1PC9hPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBCYXNlNjRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0gew0KKw0KKyAgICAvLyBEZWZhdWx0IGxpbmUgbGVuZ3RoIHBlciBSRkMgMjA0NSBzZWN0aW9uIDYuOC4NCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTElORV9MRU5HVEggPSA3NjsNCisNCisgICAgLy8gQ1JMRiBsaW5lIHNlcGFyYXRvciBwZXIgUkZDIDIwNDUgc2VjdGlvbiAyLjEuDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDUkxGX1NFUEFSQVRPUiA9IHsgJ1xyJywgJ1xuJyB9Ow0KKw0KKyAgICAvLyBUaGlzIGFycmF5IGlzIGEgbG9va3VwIHRhYmxlIHRoYXQgdHJhbnNsYXRlcyA2LWJpdCBwb3NpdGl2ZSBpbnRlZ2VyIGluZGV4DQorICAgIC8vIHZhbHVlcyBpbnRvIHRoZWlyICJCYXNlNjQgQWxwaGFiZXQiIGVxdWl2YWxlbnRzIGFzIHNwZWNpZmllZCBpbiBUYWJsZSAxDQorICAgIC8vIG9mIFJGQyAyMDQ1Lg0KKyAgICBzdGF0aWMgZmluYWwgYnl0ZVtdIEJBU0U2NF9UQUJMRSA9IHsgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywNCisgICAgICAgICAgICAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsDQorICAgICAgICAgICAgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLA0KKyAgICAgICAgICAgICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywNCisgICAgICAgICAgICAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsDQorICAgICAgICAgICAgJzYnLCAnNycsICc4JywgJzknLCAnKycsICcvJyB9Ow0KKw0KKyAgICAvLyBCeXRlIHVzZWQgdG8gcGFkIG91dHB1dC4NCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCQVNFNjRfUEFEID0gJz0nOw0KKw0KKyAgICAvLyBUaGlzIHNldCBjb250YWlucyBhbGwgYmFzZTY0IGNoYXJhY3RlcnMgaW5jbHVkaW5nIHRoZSBwYWQgY2hhcmFjdGVyLiBVc2VkDQorICAgIC8vIHNvbGVseSB0byBjaGVjayBpZiBhIGxpbmUgc2VwYXJhdG9yIGNvbnRhaW5zIGFueSBvZiB0aGVzZSBjaGFyYWN0ZXJzLg0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Qnl0ZT4gQkFTRTY0X0NIQVJTID0gbmV3IEhhc2hTZXQ8Qnl0ZT4oKTsNCisNCisgICAgc3RhdGljIHsNCisgICAgICAgIGZvciAoYnl0ZSBiIDogQkFTRTY0X1RBQkxFKSB7DQorICAgICAgICAgICAgQkFTRTY0X0NIQVJTLmFkZChiKTsNCisgICAgICAgIH0NCisgICAgICAgIEJBU0U2NF9DSEFSUy5hZGQoQkFTRTY0X1BBRCk7DQorICAgIH0NCisNCisgICAgLy8gTWFzayB1c2VkIHRvIGV4dHJhY3QgNiBiaXRzDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVNLXzZCSVRTID0gMHgzZjsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERURfQlVGRkVSX1NJWkUgPSAyMDQ4Ow0KKw0KKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBzaW5nbGVCeXRlID0gbmV3IGJ5dGVbMV07DQorDQorICAgIHByaXZhdGUgZmluYWwgaW50IGxpbmVMZW5ndGg7DQorICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGxpbmVTZXBhcmF0b3I7DQorDQorICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gZW5jb2RlZDsNCisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb24gPSAwOw0KKw0KKyAgICBwcml2YXRlIGludCBkYXRhID0gMDsNCisgICAgcHJpdmF0ZSBpbnQgbW9kdWx1cyA9IDA7DQorDQorICAgIHByaXZhdGUgaW50IGxpbmVQb3NpdGlvbiA9IDA7DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgPGNvZGU+QmFzZTY0T3V0cHV0U3RyZWFtPC9jb2RlPiB0aGF0IHdyaXRlcyB0aGUgZW5jb2RlZCBkYXRhDQorICAgICAqIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtIHVzaW5nIHRoZSBkZWZhdWx0IGxpbmUgbGVuZ3RoICg3NikgYW5kIGxpbmUNCisgICAgICogc2VwYXJhdG9yIChDUkxGKS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBvdXQNCisgICAgICogICAgICAgICAgICB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgQmFzZTY0T3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsNCisgICAgICAgIHRoaXMob3V0LCBERUZBVUxUX0xJTkVfTEVOR1RILCBDUkxGX1NFUEFSQVRPUik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSA8Y29kZT5CYXNlNjRPdXRwdXRTdHJlYW08L2NvZGU+IHRoYXQgd3JpdGVzIHRoZSBlbmNvZGVkIGRhdGENCisgICAgICogdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0gdXNpbmcgdGhlIGdpdmVuIGxpbmUgbGVuZ3RoIGFuZCB0aGUgZGVmYXVsdA0KKyAgICAgKiBsaW5lIHNlcGFyYXRvciAoQ1JMRikuDQorICAgICAqIDxwPg0KKyAgICAgKiBUaGUgZ2l2ZW4gbGluZSBsZW5ndGggd2lsbCBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIDQuIElmDQorICAgICAqIHRoZSBsaW5lIGxlbmd0aCBpcyB6ZXJvIHRoZW4gdGhlIG91dHB1dCB3aWxsIG5vdCBiZSBzcGxpdCBpbnRvIGxpbmVzLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIG91dA0KKyAgICAgKiAgICAgICAgICAgIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbS4NCisgICAgICogQHBhcmFtIGxpbmVMZW5ndGgNCisgICAgICogICAgICAgICAgICBkZXNpcmVkIGxpbmUgbGVuZ3RoLg0KKyAgICAgKi8NCisgICAgcHVibGljIEJhc2U2NE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBpbnQgbGluZUxlbmd0aCkgew0KKyAgICAgICAgdGhpcyhvdXQsIGxpbmVMZW5ndGgsIENSTEZfU0VQQVJBVE9SKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIDxjb2RlPkJhc2U2NE91dHB1dFN0cmVhbTwvY29kZT4gdGhhdCB3cml0ZXMgdGhlIGVuY29kZWQgZGF0YQ0KKyAgICAgKiB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbSB1c2luZyB0aGUgZ2l2ZW4gbGluZSBsZW5ndGggYW5kIGxpbmUNCisgICAgICogc2VwYXJhdG9yLg0KKyAgICAgKiA8cD4NCisgICAgICogVGhlIGdpdmVuIGxpbmUgbGVuZ3RoIHdpbGwgYmUgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZSBvZiA0LiBJZg0KKyAgICAgKiB0aGUgbGluZSBsZW5ndGggaXMgemVybyB0aGVuIHRoZSBvdXRwdXQgd2lsbCBub3QgYmUgc3BsaXQgaW50byBsaW5lcyBhbmQNCisgICAgICogdGhlIGxpbmUgc2VwYXJhdG9yIGlzIGlnbm9yZWQuDQorICAgICAqIDxwPg0KKyAgICAgKiBUaGUgbGluZSBzZXBhcmF0b3IgbXVzdCBub3QgaW5jbHVkZSBjaGFyYWN0ZXJzIGZyb20gdGhlIEJBU0U2NCBhbHBoYWJldA0KKyAgICAgKiAoaW5jbHVkaW5nIHRoZSBwYWRkaW5nIGNoYXJhY3RlciA8Y29kZT49PC9jb2RlPikuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gb3V0DQorICAgICAqICAgICAgICAgICAgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtLg0KKyAgICAgKiBAcGFyYW0gbGluZUxlbmd0aA0KKyAgICAgKiAgICAgICAgICAgIGRlc2lyZWQgbGluZSBsZW5ndGguDQorICAgICAqIEBwYXJhbSBsaW5lU2VwYXJhdG9yDQorICAgICAqICAgICAgICAgICAgbGluZSBzZXBhcmF0b3IgdG8gdXNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIEJhc2U2NE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBpbnQgbGluZUxlbmd0aCwNCisgICAgICAgICAgICBieXRlW10gbGluZVNlcGFyYXRvcikgew0KKyAgICAgICAgc3VwZXIob3V0KTsNCisNCisgICAgICAgIGlmIChvdXQgPT0gbnVsbCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorICAgICAgICBpZiAobGluZUxlbmd0aCA8IDApDQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOw0KKyAgICAgICAgY2hlY2tMaW5lU2VwYXJhdG9yKGxpbmVTZXBhcmF0b3IpOw0KKw0KKyAgICAgICAgdGhpcy5saW5lTGVuZ3RoID0gbGluZUxlbmd0aDsNCisgICAgICAgIHRoaXMubGluZVNlcGFyYXRvciA9IG5ldyBieXRlW2xpbmVTZXBhcmF0b3IubGVuZ3RoXTsNCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGluZVNlcGFyYXRvciwgMCwgdGhpcy5saW5lU2VwYXJhdG9yLCAwLA0KKyAgICAgICAgICAgICAgICBsaW5lU2VwYXJhdG9yLmxlbmd0aCk7DQorDQorICAgICAgICB0aGlzLmVuY29kZWQgPSBuZXcgYnl0ZVtFTkNPREVEX0JVRkZFUl9TSVpFXTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoY2xvc2VkKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQmFzZTY0T3V0cHV0U3RyZWFtIGhhcyBiZWVuIGNsb3NlZCIpOw0KKw0KKyAgICAgICAgc2luZ2xlQnl0ZVswXSA9IChieXRlKSBiOw0KKyAgICAgICAgd3JpdGUwKHNpbmdsZUJ5dGUsIDAsIDEpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKGNsb3NlZCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkJhc2U2NE91dHB1dFN0cmVhbSBoYXMgYmVlbiBjbG9zZWQiKTsNCisNCisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsNCisNCisgICAgICAgIGlmIChidWZmZXIubGVuZ3RoID09IDApDQorICAgICAgICAgICAgcmV0dXJuOw0KKw0KKyAgICAgICAgd3JpdGUwKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBvZmZzZXQsDQorICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGlmIChjbG9zZWQpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJCYXNlNjRPdXRwdXRTdHJlYW0gaGFzIGJlZW4gY2xvc2VkIik7DQorDQorICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpDQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7DQorDQorICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBsZW5ndGggPCAwIHx8IG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpDQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsNCisNCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkNCisgICAgICAgICAgICByZXR1cm47DQorDQorICAgICAgICB3cml0ZTAoYnVmZmVyLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGlmIChjbG9zZWQpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJCYXNlNjRPdXRwdXRTdHJlYW0gaGFzIGJlZW4gY2xvc2VkIik7DQorDQorICAgICAgICBmbHVzaDAoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKGNsb3NlZCkNCisgICAgICAgICAgICByZXR1cm47DQorDQorICAgICAgICBjbG9zZWQgPSB0cnVlOw0KKyAgICAgICAgY2xvc2UwKCk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlMChmaW5hbCBieXRlW10gYnVmZmVyLCBmaW5hbCBpbnQgZnJvbSwgZmluYWwgaW50IHRvKQ0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBmb3IgKGludCBpID0gZnJvbTsgaSA8IHRvOyBpKyspIHsNCisgICAgICAgICAgICBkYXRhID0gKGRhdGEgPDwgOCkgfCAoYnVmZmVyW2ldICYgMHhmZik7DQorDQorICAgICAgICAgICAgaWYgKCsrbW9kdWx1cyA9PSAzKSB7DQorICAgICAgICAgICAgICAgIG1vZHVsdXMgPSAwOw0KKw0KKyAgICAgICAgICAgICAgICAvLyB3cml0ZSBsaW5lIHNlcGFyYXRvciBpZiBuZWNlc3NhcnkNCisNCisgICAgICAgICAgICAgICAgaWYgKGxpbmVMZW5ndGggPiAwICYmIGxpbmVQb3NpdGlvbiA+PSBsaW5lTGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZUxpbmVTZXBhcmF0b3IoKSBpbmxpbmVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zDQorDQorICAgICAgICAgICAgICAgICAgICBsaW5lUG9zaXRpb24gPSAwOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZWQubGVuZ3RoIC0gcG9zaXRpb24gPCBsaW5lU2VwYXJhdG9yLmxlbmd0aCkNCisgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaDAoKTsNCisNCisgICAgICAgICAgICAgICAgICAgIGZvciAoYnl0ZSBscyA6IGxpbmVTZXBhcmF0b3IpDQorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZFtwb3NpdGlvbisrXSA9IGxzOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIC8vIGVuY29kZSBkYXRhIGludG8gNCBieXRlcw0KKw0KKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZC5sZW5ndGggLSBwb3NpdGlvbiA8IDQpDQorICAgICAgICAgICAgICAgICAgICBmbHVzaDAoKTsNCisNCisgICAgICAgICAgICAgICAgZW5jb2RlZFtwb3NpdGlvbisrXSA9IEJBU0U2NF9UQUJMRVsoZGF0YSA+PiAxOCkgJiBNQVNLXzZCSVRTXTsNCisgICAgICAgICAgICAgICAgZW5jb2RlZFtwb3NpdGlvbisrXSA9IEJBU0U2NF9UQUJMRVsoZGF0YSA+PiAxMikgJiBNQVNLXzZCSVRTXTsNCisgICAgICAgICAgICAgICAgZW5jb2RlZFtwb3NpdGlvbisrXSA9IEJBU0U2NF9UQUJMRVsoZGF0YSA+PiA2KSAmIE1BU0tfNkJJVFNdOw0KKyAgICAgICAgICAgICAgICBlbmNvZGVkW3Bvc2l0aW9uKytdID0gQkFTRTY0X1RBQkxFW2RhdGEgJiBNQVNLXzZCSVRTXTsNCisNCisgICAgICAgICAgICAgICAgbGluZVBvc2l0aW9uICs9IDQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBmbHVzaDAoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKHBvc2l0aW9uID4gMCkgew0KKyAgICAgICAgICAgIG91dC53cml0ZShlbmNvZGVkLCAwLCBwb3NpdGlvbik7DQorICAgICAgICAgICAgcG9zaXRpb24gPSAwOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBjbG9zZTAoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKG1vZHVsdXMgIT0gMCkNCisgICAgICAgICAgICB3cml0ZVBhZCgpOw0KKw0KKyAgICAgICAgLy8gd3JpdGUgbGluZSBzZXBhcmF0b3IgYXQgdGhlIGVuZCBvZiB0aGUgZW5jb2RlZCBkYXRhDQorDQorICAgICAgICBpZiAobGluZUxlbmd0aCA+IDAgJiYgbGluZVBvc2l0aW9uID4gMCkgew0KKyAgICAgICAgICAgIHdyaXRlTGluZVNlcGFyYXRvcigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZmx1c2gwKCk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIC8vIHdyaXRlIGxpbmUgc2VwYXJhdG9yIGlmIG5lY2Vzc2FyeQ0KKw0KKyAgICAgICAgaWYgKGxpbmVMZW5ndGggPiAwICYmIGxpbmVQb3NpdGlvbiA+PSBsaW5lTGVuZ3RoKSB7DQorICAgICAgICAgICAgd3JpdGVMaW5lU2VwYXJhdG9yKCk7DQorICAgICAgICB9DQorDQorICAgICAgICAvLyBlbmNvZGUgZGF0YSBpbnRvIDQgYnl0ZXMNCisNCisgICAgICAgIGlmIChlbmNvZGVkLmxlbmd0aCAtIHBvc2l0aW9uIDwgNCkNCisgICAgICAgICAgICBmbHVzaDAoKTsNCisNCisgICAgICAgIGlmIChtb2R1bHVzID09IDEpIHsNCisgICAgICAgICAgICBlbmNvZGVkW3Bvc2l0aW9uKytdID0gQkFTRTY0X1RBQkxFWyhkYXRhID4+IDIpICYgTUFTS182QklUU107DQorICAgICAgICAgICAgZW5jb2RlZFtwb3NpdGlvbisrXSA9IEJBU0U2NF9UQUJMRVsoZGF0YSA8PCA0KSAmIE1BU0tfNkJJVFNdOw0KKyAgICAgICAgICAgIGVuY29kZWRbcG9zaXRpb24rK10gPSBCQVNFNjRfUEFEOw0KKyAgICAgICAgICAgIGVuY29kZWRbcG9zaXRpb24rK10gPSBCQVNFNjRfUEFEOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBhc3NlcnQgbW9kdWx1cyA9PSAyOw0KKyAgICAgICAgICAgIGVuY29kZWRbcG9zaXRpb24rK10gPSBCQVNFNjRfVEFCTEVbKGRhdGEgPj4gMTApICYgTUFTS182QklUU107DQorICAgICAgICAgICAgZW5jb2RlZFtwb3NpdGlvbisrXSA9IEJBU0U2NF9UQUJMRVsoZGF0YSA+PiA0KSAmIE1BU0tfNkJJVFNdOw0KKyAgICAgICAgICAgIGVuY29kZWRbcG9zaXRpb24rK10gPSBCQVNFNjRfVEFCTEVbKGRhdGEgPDwgMikgJiBNQVNLXzZCSVRTXTsNCisgICAgICAgICAgICBlbmNvZGVkW3Bvc2l0aW9uKytdID0gQkFTRTY0X1BBRDsNCisgICAgICAgIH0NCisNCisgICAgICAgIGxpbmVQb3NpdGlvbiArPSA0Ow0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCB3cml0ZUxpbmVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgbGluZVBvc2l0aW9uID0gMDsNCisNCisgICAgICAgIGlmIChlbmNvZGVkLmxlbmd0aCAtIHBvc2l0aW9uIDwgbGluZVNlcGFyYXRvci5sZW5ndGgpDQorICAgICAgICAgICAgZmx1c2gwKCk7DQorDQorICAgICAgICBmb3IgKGJ5dGUgbHMgOiBsaW5lU2VwYXJhdG9yKQ0KKyAgICAgICAgICAgIGVuY29kZWRbcG9zaXRpb24rK10gPSBsczsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tMaW5lU2VwYXJhdG9yKGJ5dGVbXSBsaW5lU2VwYXJhdG9yKSB7DQorICAgICAgICBpZiAobGluZVNlcGFyYXRvci5sZW5ndGggPiBFTkNPREVEX0JVRkZFUl9TSVpFKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpbmUgc2VwYXJhdG9yIGxlbmd0aCBleGNlZWRzICINCisgICAgICAgICAgICAgICAgICAgICsgRU5DT0RFRF9CVUZGRVJfU0laRSk7DQorDQorICAgICAgICBmb3IgKGJ5dGUgYiA6IGxpbmVTZXBhcmF0b3IpIHsNCisgICAgICAgICAgICBpZiAoQkFTRTY0X0NIQVJTLmNvbnRhaW5zKGIpKSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oDQorICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUgc2VwYXJhdG9yIG11c3Qgbm90IGNvbnRhaW4gYmFzZTY0IGNoYXJhY3RlciAnIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoY2hhcikgKGIgJiAweGZmKSArICInIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvQnl0ZVF1ZXVlLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0J5dGVRdWV1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyN2RmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0J5dGVRdWV1ZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQorDQorcHVibGljIGNsYXNzIEJ5dGVRdWV1ZSBpbXBsZW1lbnRzIEl0ZXJhYmxlPEJ5dGU+IHsNCisNCisgICAgcHJpdmF0ZSBVbmJvdW5kZWRGaWZvQnl0ZUJ1ZmZlciBidWY7DQorICAgIHByaXZhdGUgaW50IGluaXRpYWxDYXBhY2l0eSA9IC0xOw0KKw0KKyAgICBwdWJsaWMgQnl0ZVF1ZXVlKCkgew0KKyAgICAgICAgYnVmID0gbmV3IFVuYm91bmRlZEZpZm9CeXRlQnVmZmVyKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIEJ5dGVRdWV1ZShpbnQgaW5pdGlhbENhcGFjaXR5KSB7DQorICAgICAgICBidWYgPSBuZXcgVW5ib3VuZGVkRmlmb0J5dGVCdWZmZXIoaW5pdGlhbENhcGFjaXR5KTsNCisgICAgICAgIHRoaXMuaW5pdGlhbENhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5Ow0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIGVucXVldWUoYnl0ZSBiKSB7DQorICAgICAgICBidWYuYWRkKGIpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBieXRlIGRlcXVldWUoKSB7DQorICAgICAgICByZXR1cm4gYnVmLnJlbW92ZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgY291bnQoKSB7DQorICAgICAgICByZXR1cm4gYnVmLnNpemUoKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsNCisgICAgICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgIT0gLTEpDQorICAgICAgICAgICAgYnVmID0gbmV3IFVuYm91bmRlZEZpZm9CeXRlQnVmZmVyKGluaXRpYWxDYXBhY2l0eSk7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgYnVmID0gbmV3IFVuYm91bmRlZEZpZm9CeXRlQnVmZmVyKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIEl0ZXJhdG9yPEJ5dGU+IGl0ZXJhdG9yKCkgew0KKyAgICAgICAgcmV0dXJuIGJ1Zi5pdGVyYXRvcigpOw0KKyAgICB9DQorDQorDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvQ29kZWNVdGlsLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0NvZGVjVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NDIxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0NvZGVjVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYzsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07DQorDQorLyoqDQorICogVXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gY29kZWNzLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb2RlY1V0aWwgew0KKyAgICANCisgICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VOQ09ESU5HX0JVRkZFUl9TSVpFID0gMTAyNDsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIG9uZSBzdHJlYW0gdG8gdGhlIG90aGVyLg0KKyAgICAgKiBAcGFyYW0gaW4gbm90IG51bGwNCisgICAgICogQHBhcmFtIG91dCBub3QgbnVsbA0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weShmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtERUZBVUxUX0VOQ09ESU5HX0JVRkZFUl9TSVpFXTsNCisgICAgICAgIGludCBpbnB1dExlbmd0aDsNCisgICAgICAgIHdoaWxlICgtMSAhPSAoaW5wdXRMZW5ndGggPSBpbi5yZWFkKGJ1ZmZlcikpKSB7DQorICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgaW5wdXRMZW5ndGgpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogRW5jb2RlcyB0aGUgZ2l2ZW4gc3RyZWFtIHVzaW5nIFF1b3RlZC1QcmludGFibGUuDQorICAgICAqIFRoaXMgYXNzdW1lcyB0aGF0IHN0cmVhbSBpcyBiaW5hcnkgYW5kIHRoZXJlZm9yZSBlc2NhcGVzDQorICAgICAqIGFsbCBsaW5lIGVuZGluZ3MuDQorICAgICAqIEBwYXJhbSBpbiBub3QgbnVsbA0KKyAgICAgKiBAcGFyYW0gb3V0IG5vdCBudWxsDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmNvZGVRdW90ZWRQcmludGFibGVCaW5hcnkoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICANCisgICAgICAgIFF1b3RlZFByaW50YWJsZUVuY29kZXIgZW5jb2RlciA9IG5ldyBRdW90ZWRQcmludGFibGVFbmNvZGVyKERFRkFVTFRfRU5DT0RJTkdfQlVGRkVSX1NJWkUsIHRydWUpOw0KKyAgICAgICAgZW5jb2Rlci5lbmNvZGUoaW4sIG91dCk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBFbmNvZGVzIHRoZSBnaXZlbiBzdHJlYW0gdXNpbmcgUXVvdGVkLVByaW50YWJsZS4NCisgICAgICogVGhpcyBhc3N1bWVzIHRoYXQgc3RyZWFtIGlzIHRleHQgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCBlc2NhcGUNCisgICAgICogYWxsIGxpbmUgZW5kaW5ncy4NCisgICAgICogQHBhcmFtIGluIG5vdCBudWxsDQorICAgICAqIEBwYXJhbSBvdXQgbm90IG51bGwNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGVuY29kZVF1b3RlZFByaW50YWJsZShmaW5hbCBJbnB1dFN0cmVhbSBpbiwgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGZpbmFsIFF1b3RlZFByaW50YWJsZUVuY29kZXIgZW5jb2RlciA9IG5ldyBRdW90ZWRQcmludGFibGVFbmNvZGVyKERFRkFVTFRfRU5DT0RJTkdfQlVGRkVSX1NJWkUsIGZhbHNlKTsNCisgICAgICAgIGVuY29kZXIuZW5jb2RlKGluLCBvdXQpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogRW5jb2RlcyB0aGUgZ2l2ZW4gc3RyZWFtIHVzaW5nIGJhc2U2NC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGluIG5vdCBudWxsDQorICAgICAqIEBwYXJhbSBvdXQgbm90IG51bGwNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5jb2RlQmFzZTY0KGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgQmFzZTY0T3V0cHV0U3RyZWFtIGI2NE91dCA9IG5ldyBCYXNlNjRPdXRwdXRTdHJlYW0ob3V0KTsNCisgICAgICAgIGNvcHkoaW4sIGI2NE91dCk7DQorICAgICAgICBiNjRPdXQuY2xvc2UoKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIFdyYXBzIHRoZSBnaXZlbiBzdHJlYW0gaW4gYSBRdW90ZWQtUHJpbnRhYmxlIGVuY29kZXIuDQorICAgICAqIEBwYXJhbSBvdXQgbm90IG51bGwNCisgICAgICogQHJldHVybiBlbmNvZGluZyBvdXRwdXRzdHJlYW0gDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgT3V0cHV0U3RyZWFtIHdyYXBRdW90ZWRQcmludGFibGUoZmluYWwgT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBiaW5hcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gbmV3IFF1b3RlZFByaW50YWJsZU91dHB1dFN0cmVhbShvdXQsIGJpbmFyeSk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBXcmFwcyB0aGUgZ2l2ZW4gc3RyZWFtIGluIGEgQmFzZTY0IGVuY29kZXIuDQorICAgICAqIEBwYXJhbSBvdXQgbm90IG51bGwNCisgICAgICogQHJldHVybiBlbmNvZGluZyBvdXRwdXRzdHJlYW0gDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgT3V0cHV0U3RyZWFtIHdyYXBCYXNlNjQoZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIHJldHVybiBuZXcgQmFzZTY0T3V0cHV0U3RyZWFtKG91dCk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9EZWNvZGVyVXRpbC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9EZWNvZGVyVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTI2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0RlY29kZXJVdGlsLmphdmEKQEAgLTAsMCArMSwyNTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7DQorDQorLyoqDQorICogU3RhdGljIG1ldGhvZHMgZm9yIGRlY29kaW5nIHN0cmluZ3MsIGJ5dGUgYXJyYXlzIGFuZCBlbmNvZGVkIHdvcmRzLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBEZWNvZGVyVXRpbCB7DQorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWNvZGVyVXRpbC5jbGFzcyk7DQorICAgIA0KKyAgICAvKioNCisgICAgICogRGVjb2RlcyBhIHN0cmluZyBjb250YWluaW5nIHF1b3RlZC1wcmludGFibGUgZW5jb2RlZCBkYXRhLiANCisgICAgICogDQorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gZGVjb2RlLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJ5dGVzLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlQmFzZVF1b3RlZFByaW50YWJsZShTdHJpbmcgcykgew0KKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgICAgICANCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gcy5nZXRCeXRlcygiVVMtQVNDSUkiKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBRdW90ZWRQcmludGFibGVJbnB1dFN0cmVhbSBpcyA9IG5ldyBRdW90ZWRQcmludGFibGVJbnB1dFN0cmVhbSgNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGludCBiID0gMDsNCisgICAgICAgICAgICB3aGlsZSAoKGIgPSBpcy5yZWFkKCkpICE9IC0xKSB7DQorICAgICAgICAgICAgICAgIGJhb3Mud3JpdGUoYik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIC8qDQorICAgICAgICAgICAgICogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIQ0KKyAgICAgICAgICAgICAqLw0KKyAgICAgICAgICAgIGxvZy5lcnJvcihlKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIERlY29kZXMgYSBzdHJpbmcgY29udGFpbmluZyBiYXNlNjQgZW5jb2RlZCBkYXRhLiANCisgICAgICogDQorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gZGVjb2RlLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIGJ5dGVzLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlQmFzZTY0KFN0cmluZyBzKSB7DQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgIA0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBzLmdldEJ5dGVzKCJVUy1BU0NJSSIpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIEJhc2U2NElucHV0U3RyZWFtIGlzID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBpbnQgYiA9IDA7DQorICAgICAgICAgICAgd2hpbGUgKChiID0gaXMucmVhZCgpKSAhPSAtMSkgew0KKyAgICAgICAgICAgICAgICBiYW9zLndyaXRlKGIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICAvKg0KKyAgICAgICAgICAgICAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiENCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICBsb2cuZXJyb3IoZSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBEZWNvZGVzIGFuIGVuY29kZWQgd29yZCBlbmNvZGVkIHdpdGggdGhlICdCJyBlbmNvZGluZyAoZGVzY3JpYmVkIGluIA0KKyAgICAgKiBSRkMgMjA0NykgZm91bmQgaW4gYSBoZWFkZXIgZmllbGQgYm9keS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBlbmNvZGVkV29yZCB0aGUgZW5jb2RlZCB3b3JkIHRvIGRlY29kZS4NCisgICAgICogQHBhcmFtIGNoYXJzZXQgdGhlIEphdmEgY2hhcnNldCB0byB1c2UuDQorICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgc3RyaW5nLg0KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgdGhlIGdpdmVuIEphdmEgY2hhcnNldCBpc24ndCANCisgICAgICogICAgICAgICBzdXBwb3J0ZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVCKFN0cmluZyBlbmNvZGVkV29yZCwgU3RyaW5nIGNoYXJzZXQpIA0KKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsNCisgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGVjb2RlQmFzZTY0KGVuY29kZWRXb3JkKSwgY2hhcnNldCk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBEZWNvZGVzIGFuIGVuY29kZWQgd29yZCBlbmNvZGVkIHdpdGggdGhlICdRJyBlbmNvZGluZyAoZGVzY3JpYmVkIGluIA0KKyAgICAgKiBSRkMgMjA0NykgZm91bmQgaW4gYSBoZWFkZXIgZmllbGQgYm9keS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBlbmNvZGVkV29yZCB0aGUgZW5jb2RlZCB3b3JkIHRvIGRlY29kZS4NCisgICAgICogQHBhcmFtIGNoYXJzZXQgdGhlIEphdmEgY2hhcnNldCB0byB1c2UuDQorICAgICAqIEByZXR1cm4gdGhlIGRlY29kZWQgc3RyaW5nLg0KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gaWYgdGhlIGdpdmVuIEphdmEgY2hhcnNldCBpc24ndCANCisgICAgICogICAgICAgICBzdXBwb3J0ZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGVRKFN0cmluZyBlbmNvZGVkV29yZCwgU3RyaW5nIGNoYXJzZXQpDQorICAgICAgICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KKyAgICAgICAgICAgDQorICAgICAgICAvKg0KKyAgICAgICAgICogUmVwbGFjZSBfIHdpdGggPTIwDQorICAgICAgICAgKi8NCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbmNvZGVkV29yZC5sZW5ndGgoKTsgaSsrKSB7DQorICAgICAgICAgICAgY2hhciBjID0gZW5jb2RlZFdvcmQuY2hhckF0KGkpOw0KKyAgICAgICAgICAgIGlmIChjID09ICdfJykgew0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIj0yMCIpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGRlY29kZUJhc2VRdW90ZWRQcmludGFibGUoc2IudG9TdHJpbmcoKSksIGNoYXJzZXQpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogRGVjb2RlcyBhIHN0cmluZyBjb250YWluaW5nIGVuY29kZWQgd29yZHMgYXMgZGVmaW5lZCBieSBSRkMgMjA0Ny4NCisgICAgICogRW5jb2RlZCB3b3JkcyBpbiBoYXZlIHRoZSBmb3JtIA0KKyAgICAgKiA9P2NoYXJzZXQ/ZW5jP0VuY29kZWQgd29yZD89IHdoZXJlIGVuYyBpcyBlaXRoZXIgJ1EnIG9yICdxJyBmb3IgDQorICAgICAqIHF1b3RlZC1wcmludGFibGUgYW5kICdCJyBvciAnYicgZm9yIEJhc2U2NC4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBib2R5IHRoZSBzdHJpbmcgdG8gZGVjb2RlLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHN0cmluZy4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZUVuY29kZWRXb3JkcyhTdHJpbmcgYm9keSkgew0KKyAgICAgICAgaW50IHByZXZpb3VzRW5kID0gMDsNCisgICAgICAgIGJvb2xlYW4gcHJldmlvdXNXYXNFbmNvZGVkID0gZmFsc2U7DQorDQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisNCisgICAgICAgIHdoaWxlICh0cnVlKSB7DQorICAgICAgICAgICAgaW50IGJlZ2luID0gYm9keS5pbmRleE9mKCI9PyIsIHByZXZpb3VzRW5kKTsNCisgICAgICAgICAgICBpbnQgZW5kID0gYmVnaW4gPT0gLTEgPyAtMSA6IGJvZHkuaW5kZXhPZigiPz0iLCBiZWdpbiArIDIpOw0KKyAgICAgICAgICAgIGlmIChlbmQgPT0gLTEpIHsNCisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzRW5kID09IDApDQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9keTsNCisNCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJvZHkuc3Vic3RyaW5nKHByZXZpb3VzRW5kKSk7DQorICAgICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbmQgKz0gMjsNCisNCisgICAgICAgICAgICBTdHJpbmcgc2VwID0gYm9keS5zdWJzdHJpbmcocHJldmlvdXNFbmQsIGJlZ2luKTsNCisNCisgICAgICAgICAgICBTdHJpbmcgZGVjb2RlZCA9IGRlY29kZUVuY29kZWRXb3JkKGJvZHksIGJlZ2luLCBlbmQpOw0KKyAgICAgICAgICAgIGlmIChkZWNvZGVkID09IG51bGwpIHsNCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNlcCk7DQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChib2R5LnN1YnN0cmluZyhiZWdpbiwgZW5kKSk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c1dhc0VuY29kZWQgfHwgIUNoYXJzZXRVdGlsLmlzV2hpdGVzcGFjZShzZXApKSB7DQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc2VwKTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZGVjb2RlZCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHByZXZpb3VzRW5kID0gZW5kOw0KKyAgICAgICAgICAgIHByZXZpb3VzV2FzRW5jb2RlZCA9IGRlY29kZWQgIT0gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvLyByZXR1cm4gbnVsbCBvbiBlcnJvcg0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVjb2RlRW5jb2RlZFdvcmQoU3RyaW5nIGJvZHksIGludCBiZWdpbiwgaW50IGVuZCkgew0KKyAgICAgICAgaW50IHFtMSA9IGJvZHkuaW5kZXhPZignPycsIGJlZ2luICsgMik7DQorICAgICAgICBpZiAocW0xID09IGVuZCAtIDIpDQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorDQorICAgICAgICBpbnQgcW0yID0gYm9keS5pbmRleE9mKCc/JywgcW0xICsgMSk7DQorICAgICAgICBpZiAocW0yID09IGVuZCAtIDIpDQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorDQorICAgICAgICBTdHJpbmcgbWltZUNoYXJzZXQgPSBib2R5LnN1YnN0cmluZyhiZWdpbiArIDIsIHFtMSk7DQorICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBib2R5LnN1YnN0cmluZyhxbTEgKyAxLCBxbTIpOw0KKyAgICAgICAgU3RyaW5nIGVuY29kZWRUZXh0ID0gYm9keS5zdWJzdHJpbmcocW0yICsgMSwgZW5kIC0gMik7DQorDQorICAgICAgICBTdHJpbmcgY2hhcnNldCA9IENoYXJzZXRVdGlsLnRvSmF2YUNoYXJzZXQobWltZUNoYXJzZXQpOw0KKyAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJNSU1FIGNoYXJzZXQgJyIgKyBtaW1lQ2hhcnNldCArICInIGluIGVuY29kZWQgd29yZCAnIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgYm9keS5zdWJzdHJpbmcoYmVnaW4sIGVuZCkgKyAiJyBkb2Vzbid0IGhhdmUgYSAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29ycmVzcG9uZGluZyBKYXZhIGNoYXJzZXQiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICB9IGVsc2UgaWYgKCFDaGFyc2V0VXRpbC5pc0RlY29kaW5nU3VwcG9ydGVkKGNoYXJzZXQpKSB7DQorICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIkN1cnJlbnQgSkRLIGRvZXNuJ3Qgc3VwcG9ydCBkZWNvZGluZyBvZiBjaGFyc2V0ICciDQorICAgICAgICAgICAgICAgICAgICAgICAgKyBjaGFyc2V0ICsgIicgKE1JTUUgY2hhcnNldCAnIiArIG1pbWVDaGFyc2V0DQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBpbiBlbmNvZGVkIHdvcmQgJyIgKyBib2R5LnN1YnN0cmluZyhiZWdpbiwgZW5kKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicpIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgaWYgKGVuY29kZWRUZXh0Lmxlbmd0aCgpID09IDApIHsNCisgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICBsb2cud2FybigiTWlzc2luZyBlbmNvZGVkIHRleHQgaW4gZW5jb2RlZCB3b3JkOiAnIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgYm9keS5zdWJzdHJpbmcoYmVnaW4sIGVuZCkgKyAiJyIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoIlEiKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gRGVjb2RlclV0aWwuZGVjb2RlUShlbmNvZGVkVGV4dCwgY2hhcnNldCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJCIikpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIERlY29kZXJVdGlsLmRlY29kZUIoZW5jb2RlZFRleHQsIGNoYXJzZXQpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiV2FybmluZzogVW5rbm93biBlbmNvZGluZyBpbiBlbmNvZGVkIHdvcmQgJyINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBib2R5LnN1YnN0cmluZyhiZWdpbiwgZW5kKSArICInIik7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYmVjYXVzZSBvZiBpc0RlY29kaW5nU3VwcG9ydGVkIGNoZWNrIGFib3ZlDQorICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIlVuc3VwcG9ydGVkIGVuY29kaW5nIGluIGVuY29kZWQgd29yZCAnIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgYm9keS5zdWJzdHJpbmcoYmVnaW4sIGVuZCkgKyAiJyIsIGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJDb3VsZCBub3QgZGVjb2RlIGVuY29kZWQgd29yZCAnIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgYm9keS5zdWJzdHJpbmcoYmVnaW4sIGVuZCkgKyAiJyIsIGUpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0VuY29kZXJVdGlsLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0VuY29kZXJVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5Yzc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvRW5jb2RlclV0aWwuamF2YQpAQCAtMCwwICsxLDYwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CisKKy8qKgorICogU3RhdGljIG1ldGhvZHMgZm9yIGVuY29kaW5nIGhlYWRlciBmaWVsZCB2YWx1ZXMuIFRoaXMgaW5jbHVkZXMgZW5jb2RlZC13b3JkcworICogYXMgZGVmaW5lZCBpbiA8YSBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjA0Ny5odG1sJz5SRkMgMjA0NzwvYT4KKyAqIG9yIGRpc3BsYXktbmFtZXMgb2YgYW4gZS1tYWlsIGFkZHJlc3MsIGZvciBleGFtcGxlLgorICovCitwdWJsaWMgY2xhc3MgRW5jb2RlclV0aWwgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBCQVNFNjRfVEFCTEUgPSBCYXNlNjRPdXRwdXRTdHJlYW0uQkFTRTY0X1RBQkxFOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQkFTRTY0X1BBRCA9ICc9JzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpdFNldCBRX1JFR1VMQVJfQ0hBUlMgPSBpbml0Q2hhcnMoIj1fPyIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQml0U2V0IFFfUkVTVFJJQ1RFRF9DSEFSUyA9IGluaXRDaGFycygiPV8/XCIjJCUmJygpLC46Ozw+QFtcXF1eYHt8fX4iKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVVNFRF9DSEFSQUNURVJTID0gNTA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DX1dPUkRfUFJFRklYID0gIj0/IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DX1dPUkRfU1VGRklYID0gIj89IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVEX1dPUkRfTUFYX0xFTkdUSCA9IDc1OyAvLyBSRkMgMjA0NworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQml0U2V0IFRPS0VOX0NIQVJTID0gaW5pdENoYXJzKCIoKTw+QCw7OlxcXCIvW10/PSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQml0U2V0IEFURVhUX0NIQVJTID0gaW5pdENoYXJzKCIoKTw+QC4sOzpcXFwiW10iKTsKKworICAgIHByaXZhdGUgc3RhdGljIEJpdFNldCBpbml0Q2hhcnMoU3RyaW5nIHNwZWNpYWxzKSB7CisgICAgICAgIEJpdFNldCBicyA9IG5ldyBCaXRTZXQoMTI4KTsKKyAgICAgICAgZm9yIChjaGFyIGNoID0gMzM7IGNoIDwgMTI3OyBjaCsrKSB7CisgICAgICAgICAgICBpZiAoc3BlY2lhbHMuaW5kZXhPZihjaCkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicy5zZXQoY2gpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBiczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3RzIG9uZSBvZiB0aGUgdHdvIGVuY29kaW5ncyBzcGVjaWZpZWQgaW4gUkZDIDIwNDcuCisgICAgICovCisgICAgcHVibGljIGVudW0gRW5jb2RpbmcgeworICAgICAgICAvKiogVGhlIEIgZW5jb2RpbmcgKGlkZW50aWNhbCB0byBiYXNlNjQgZGVmaW5lZCBpbiBSRkMgMjA0NSkuICovCisgICAgICAgIEIsCisgICAgICAgIC8qKiBUaGUgUSBlbmNvZGluZyAoc2ltaWxhciB0byBxdW90ZWQtcHJpbnRhYmxlIGRlZmluZWQgaW4gUkZDIDIwNDUpLiAqLworICAgICAgICBRCisgICAgfQorCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoZSBpbnRlbmRlZCB1c2FnZSBvZiBhbiBlbmNvZGVkIHdvcmQuCisgICAgICovCisgICAgcHVibGljIGVudW0gVXNhZ2UgeworICAgICAgICAvKioKKyAgICAgICAgICogRW5jb2RlZCB3b3JkIGlzIHVzZWQgdG8gcmVwbGFjZSBhICd0ZXh0JyB0b2tlbiBpbiBhbnkgU3ViamVjdCBvcgorICAgICAgICAgKiBDb21tZW50cyBoZWFkZXIgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBURVhUX1RPS0VOLAorICAgICAgICAvKioKKyAgICAgICAgICogRW5jb2RlZCB3b3JkIGlzIHVzZWQgdG8gcmVwbGFjZSBhICd3b3JkJyBlbnRpdHkgd2l0aGluIGEgJ3BocmFzZScsCisgICAgICAgICAqIGZvciBleGFtcGxlLCBvbmUgdGhhdCBwcmVjZWRlcyBhbiBhZGRyZXNzIGluIGEgRnJvbSwgVG8sIG9yIENjCisgICAgICAgICAqIGhlYWRlci4KKyAgICAgICAgICovCisgICAgICAgIFdPUkRfRU5USVRZCisgICAgfQorCisgICAgcHJpdmF0ZSBFbmNvZGVyVXRpbCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBkaXNwbGF5LW5hbWUgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBTZWUgPGEKKyAgICAgKiBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjNTMyMi5odG1sJz5SRkMgNTMyMjwvYT4gc2VjdGlvbiAzLjQKKyAgICAgKiBhbmQgPGEgaHJlZj0naHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzIwNDcuaHRtbCc+UkZDIDIwNDc8L2E+IHNlY3Rpb24KKyAgICAgKiA1LjMuIFRoZSBzcGVjaWZpZWQgc3RyaW5nIHNob3VsZCBub3QgYmUgZm9sZGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaXNwbGF5TmFtZQorICAgICAqICAgICAgICAgICAgZGlzcGxheS1uYW1lIHRvIGVuY29kZS4KKyAgICAgKiBAcmV0dXJuIGVuY29kZWQgZGlzcGxheS1uYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUFkZHJlc3NEaXNwbGF5TmFtZShTdHJpbmcgZGlzcGxheU5hbWUpIHsKKyAgICAgICAgLy8gZGlzcGxheS1uYW1lID0gcGhyYXNlCisgICAgICAgIC8vIHBocmFzZSA9IDEqKCBlbmNvZGVkLXdvcmQgLyB3b3JkICkKKyAgICAgICAgLy8gd29yZCA9IGF0b20gLyBxdW90ZWQtc3RyaW5nCisgICAgICAgIC8vIGF0b20gPSBbQ0ZXU10gMSphdGV4dCBbQ0ZXU10KKyAgICAgICAgLy8gQ0ZXUyA9IGNvbW1lbnQgb3IgZm9sZGluZyB3aGl0ZSBzcGFjZQorCisgICAgICAgIGlmIChpc0F0b21QaHJhc2UoZGlzcGxheU5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZGlzcGxheU5hbWU7CisgICAgICAgIH0gZWxzZSBpZiAoaGFzVG9CZUVuY29kZWQoZGlzcGxheU5hbWUsIDApKSB7CisgICAgICAgICAgICByZXR1cm4gZW5jb2RlRW5jb2RlZFdvcmQoZGlzcGxheU5hbWUsIFVzYWdlLldPUkRfRU5USVRZKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBxdW90ZShkaXNwbGF5TmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBsb2NhbCBwYXJ0IG9mIGFuIGFkZHJlc3Mgc3BlY2lmaWNhdGlvbiBhcyBkZXNjcmliZWQgaW4gUkZDCisgICAgICogNTMyMiBzZWN0aW9uIDMuNC4xLiBMZWFkaW5nIGFuZCB0cmFpbGluZyBDRldTIHNob3VsZCBoYXZlIGJlZW4gcmVtb3ZlZAorICAgICAqIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLiBUaGUgc3BlY2lmaWVkIHN0cmluZyBzaG91bGQgbm90IGNvbnRhaW4gYW55CisgICAgICogaWxsZWdhbCAoY29udHJvbCBvciBub24tQVNDSUkpIGNoYXJhY3RlcnMuCisgICAgICogCisgICAgICogQHBhcmFtIGxvY2FsUGFydAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIHBhcnQgdG8gZW5jb2RlCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBsb2NhbCBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUFkZHJlc3NMb2NhbFBhcnQoU3RyaW5nIGxvY2FsUGFydCkgeworICAgICAgICAvLyBsb2NhbC1wYXJ0ID0gZG90LWF0b20gLyBxdW90ZWQtc3RyaW5nCisgICAgICAgIC8vIGRvdC1hdG9tID0gW0NGV1NdIGRvdC1hdG9tLXRleHQgW0NGV1NdCisgICAgICAgIC8vIENGV1MgPSBjb21tZW50IG9yIGZvbGRpbmcgd2hpdGUgc3BhY2UKKworICAgICAgICBpZiAoaXNEb3RBdG9tVGV4dChsb2NhbFBhcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gbG9jYWxQYXJ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHF1b3RlKGxvY2FsUGFydCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBpbnRvIGEgaGVhZGVyIHBhcmFtZXRlciBhcyBkZXNjcmliZWQgaW4gUkZDCisgICAgICogMjA0NSBzZWN0aW9uIDUuMSBhbmQgUkZDIDIxODMgc2VjdGlvbiAyLiBUaGUgc3BlY2lmaWVkIHN0cmluZ3Mgc2hvdWxkIG5vdAorICAgICAqIGNvbnRhaW4gYW55IGlsbGVnYWwgKGNvbnRyb2wgb3Igbm9uLUFTQ0lJKSBjaGFyYWN0ZXJzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGVuY29kZWQgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUhlYWRlclBhcmFtZXRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisKKyAgICAgICAgLy8gdmFsdWUgOj0gdG9rZW4gLyBxdW90ZWQtc3RyaW5nCisgICAgICAgIGlmIChpc1Rva2VuKHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAiPSIgKyB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lICsgIj0iICsgcXVvdGUodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvcnRjdXQgbWV0aG9kIHRoYXQgZW5jb2RlcyB0aGUgc3BlY2lmaWVkIHRleHQgaW50byBhbiBlbmNvZGVkLXdvcmQgaWYKKyAgICAgKiB0aGUgdGV4dCBoYXMgdG8gYmUgZW5jb2RlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dAorICAgICAqICAgICAgICAgICAgdGV4dCB0byBlbmNvZGUuCisgICAgICogQHBhcmFtIHVzYWdlCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBlbmNvZGVkLXdvcmQgaXMgdG8gYmUgdXNlZCB0byByZXBsYWNlIGEgdGV4dCB0b2tlbgorICAgICAqICAgICAgICAgICAgb3IgYSB3b3JkIGVudGl0eSAoc2VlIFJGQyA4MjIpLgorICAgICAqIEBwYXJhbSB1c2VkQ2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxyZWFkeSB1c2VkIHVwICg8Y29kZT4wIDw9IHVzZWRDaGFyYWN0ZXJzIDw9IDUwPC9jb2RlPikuCisgICAgICogQHJldHVybiB0aGUgc3BlY2lmaWVkIHRleHQgaWYgZW5jb2RpbmcgaXMgbm90IG5lY2Vzc2FyeSBvciBhbiBlbmNvZGVkCisgICAgICogICAgICAgICB3b3JkIG9yIGEgc2VxdWVuY2Ugb2YgZW5jb2RlZCB3b3JkcyBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlSWZOZWNlc3NhcnkoU3RyaW5nIHRleHQsIFVzYWdlIHVzYWdlLAorICAgICAgICAgICAgaW50IHVzZWRDaGFyYWN0ZXJzKSB7CisgICAgICAgIGlmIChoYXNUb0JlRW5jb2RlZCh0ZXh0LCB1c2VkQ2hhcmFjdGVycykpCisgICAgICAgICAgICByZXR1cm4gZW5jb2RlRW5jb2RlZFdvcmQodGV4dCwgdXNhZ2UsIHVzZWRDaGFyYWN0ZXJzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBoYXMgdG8gZW5jb2RlZCBpbnRvIGFuIGVuY29kZWQtd29yZC4KKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0ZXh0IGNvbnRhaW5zIGNoYXJhY3RlcnMgdGhhdCBkb24ndAorICAgICAqIGZhbGwgaW50byB0aGUgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlciBzZXQgb3IgaWYgdGhlIHRleHQgY29udGFpbnMgYQorICAgICAqICd3b3JkJyAoc2VxdWVuY2Ugb2Ygbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycykgbG9uZ2VyIHRoYW4gNzcgY2hhcmFjdGVycworICAgICAqIChpbmNsdWRpbmcgY2hhcmFjdGVycyBhbHJlYWR5IHVzZWQgdXAgaW4gdGhlIGxpbmUpLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0CisgICAgICogICAgICAgICAgICB0ZXh0IHRvIGFuYWx5emUuCisgICAgICogQHBhcmFtIHVzZWRDaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBhbHJlYWR5IHVzZWQgdXAgKDxjb2RlPjAgPD0gdXNlZENoYXJhY3RlcnMgPD0gNTA8L2NvZGU+KS4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgdGV4dCBoYXMgdG8gYmUgZW5jb2RlZCBpbnRvCisgICAgICogICAgICAgICBhbiBlbmNvZGVkLXdvcmQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1RvQmVFbmNvZGVkKFN0cmluZyB0ZXh0LCBpbnQgdXNlZENoYXJhY3RlcnMpIHsKKyAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKHVzZWRDaGFyYWN0ZXJzIDwgMCB8fCB1c2VkQ2hhcmFjdGVycyA+IE1BWF9VU0VEX0NIQVJBQ1RFUlMpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgaW50IG5vbldoaXRlU3BhY2VDb3VudCA9IHVzZWRDaGFyYWN0ZXJzOworCisgICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IHRleHQubGVuZ3RoKCk7IGlkeCsrKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaWR4KTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXHQnIHx8IGNoID09ICcgJykgeworICAgICAgICAgICAgICAgIG5vbldoaXRlU3BhY2VDb3VudCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vbldoaXRlU3BhY2VDb3VudCsrOworICAgICAgICAgICAgICAgIGlmIChub25XaGl0ZVNwYWNlQ291bnQgPiA3NykgeworICAgICAgICAgICAgICAgICAgICAvLyBMaW5lIGNhbm5vdCBiZSBmb2xkZWQgaW50byBtdWx0aXBsZSBsaW5lcyB3aXRoIG5vIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiA3OCBjaGFyYWN0ZXJzIGVhY2guIEVuY29kaW5nIGFzIGVuY29kZWQtd29yZHMgbWFrZXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBwb3NzaWJsZS4gT25lIGNoYXJhY3RlciBoYXMgdG8gYmUgcmVzZXJ2ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgIC8vIGZvbGRpbmcgd2hpdGUgc3BhY2U7IHRoYXQgbGVhdmVzIDc3IGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjaCA8IDMyIHx8IGNoID49IDEyNykgeworICAgICAgICAgICAgICAgICAgICAvLyBub24tcHJpbnRhYmxlIGFzY2lpIGNoYXJhY3RlciBoYXMgdG8gYmUgZW5jb2RlZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB0aGUgc3BlY2lmaWVkIHRleHQgaW50byBhbiBlbmNvZGVkIHdvcmQgb3IgYSBzZXF1ZW5jZSBvZiBlbmNvZGVkCisgICAgICogd29yZHMgc2VwYXJhdGVkIGJ5IHNwYWNlLiBUaGUgdGV4dCBpcyBzZXBhcmF0ZWQgaW50byBhIHNlcXVlbmNlIG9mCisgICAgICogZW5jb2RlZCB3b3JkcyBpZiBpdCBkb2VzIG5vdCBmaXQgaW4gYSBzaW5nbGUgb25lLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaGFyc2V0IHRvIGVuY29kZSB0aGUgc3BlY2lmaWVkIHRleHQgaW50byBhIGJ5dGUgYXJyYXkgYW5kIHRoZQorICAgICAqIGVuY29kaW5nIHRvIHVzZSBmb3IgdGhlIGVuY29kZWQtd29yZCBhcmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgemVybyBjaGFyYWN0ZXJzIGhhdmUgYWxyZWFkeSBiZWVuIHVzZWQgdXAgaW4gdGhlCisgICAgICogY3VycmVudCBsaW5lLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0CisgICAgICogICAgICAgICAgICB0ZXh0IHRvIGVuY29kZS4KKyAgICAgKiBAcGFyYW0gdXNhZ2UKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGVuY29kZWQtd29yZCBpcyB0byBiZSB1c2VkIHRvIHJlcGxhY2UgYSB0ZXh0IHRva2VuCisgICAgICogICAgICAgICAgICBvciBhIHdvcmQgZW50aXR5IChzZWUgUkZDIDgyMikuCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCB3b3JkIChvciBzZXF1ZW5jZSBvZiBlbmNvZGVkIHdvcmRzIGlmIHRoZSBnaXZlbiB0ZXh0CisgICAgICogICAgICAgICBkb2VzIG5vdCBmaXQgaW4gYSBzaW5nbGUgZW5jb2RlZCB3b3JkKS4KKyAgICAgKiBAc2VlICNoYXNUb0JlRW5jb2RlZChTdHJpbmcsIGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVFbmNvZGVkV29yZChTdHJpbmcgdGV4dCwgVXNhZ2UgdXNhZ2UpIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZUVuY29kZWRXb3JkKHRleHQsIHVzYWdlLCAwLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBzcGVjaWZpZWQgdGV4dCBpbnRvIGFuIGVuY29kZWQgd29yZCBvciBhIHNlcXVlbmNlIG9mIGVuY29kZWQKKyAgICAgKiB3b3JkcyBzZXBhcmF0ZWQgYnkgc3BhY2UuIFRoZSB0ZXh0IGlzIHNlcGFyYXRlZCBpbnRvIGEgc2VxdWVuY2Ugb2YKKyAgICAgKiBlbmNvZGVkIHdvcmRzIGlmIGl0IGRvZXMgbm90IGZpdCBpbiBhIHNpbmdsZSBvbmUuCisgICAgICogPHA+CisgICAgICogVGhlIGNoYXJzZXQgdG8gZW5jb2RlIHRoZSBzcGVjaWZpZWQgdGV4dCBpbnRvIGEgYnl0ZSBhcnJheSBhbmQgdGhlCisgICAgICogZW5jb2RpbmcgdG8gdXNlIGZvciB0aGUgZW5jb2RlZC13b3JkIGFyZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0CisgICAgICogICAgICAgICAgICB0ZXh0IHRvIGVuY29kZS4KKyAgICAgKiBAcGFyYW0gdXNhZ2UKKyAgICAgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGVuY29kZWQtd29yZCBpcyB0byBiZSB1c2VkIHRvIHJlcGxhY2UgYSB0ZXh0IHRva2VuCisgICAgICogICAgICAgICAgICBvciBhIHdvcmQgZW50aXR5IChzZWUgUkZDIDgyMikuCisgICAgICogQHBhcmFtIHVzZWRDaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBhbHJlYWR5IHVzZWQgdXAgKDxjb2RlPjAgPD0gdXNlZENoYXJhY3RlcnMgPD0gNTA8L2NvZGU+KS4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHdvcmQgKG9yIHNlcXVlbmNlIG9mIGVuY29kZWQgd29yZHMgaWYgdGhlIGdpdmVuIHRleHQKKyAgICAgKiAgICAgICAgIGRvZXMgbm90IGZpdCBpbiBhIHNpbmdsZSBlbmNvZGVkIHdvcmQpLgorICAgICAqIEBzZWUgI2hhc1RvQmVFbmNvZGVkKFN0cmluZywgaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUVuY29kZWRXb3JkKFN0cmluZyB0ZXh0LCBVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIGludCB1c2VkQ2hhcmFjdGVycykgeworICAgICAgICByZXR1cm4gZW5jb2RlRW5jb2RlZFdvcmQodGV4dCwgdXNhZ2UsIHVzZWRDaGFyYWN0ZXJzLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBzcGVjaWZpZWQgdGV4dCBpbnRvIGFuIGVuY29kZWQgd29yZCBvciBhIHNlcXVlbmNlIG9mIGVuY29kZWQKKyAgICAgKiB3b3JkcyBzZXBhcmF0ZWQgYnkgc3BhY2UuIFRoZSB0ZXh0IGlzIHNlcGFyYXRlZCBpbnRvIGEgc2VxdWVuY2Ugb2YKKyAgICAgKiBlbmNvZGVkIHdvcmRzIGlmIGl0IGRvZXMgbm90IGZpdCBpbiBhIHNpbmdsZSBvbmUuCisgICAgICogCisgICAgICogQHBhcmFtIHRleHQKKyAgICAgKiAgICAgICAgICAgIHRleHQgdG8gZW5jb2RlLgorICAgICAqIEBwYXJhbSB1c2FnZQorICAgICAqICAgICAgICAgICAgd2hldGhlciB0aGUgZW5jb2RlZC13b3JkIGlzIHRvIGJlIHVzZWQgdG8gcmVwbGFjZSBhIHRleHQgdG9rZW4KKyAgICAgKiAgICAgICAgICAgIG9yIGEgd29yZCBlbnRpdHkgKHNlZSBSRkMgODIyKS4KKyAgICAgKiBAcGFyYW0gdXNlZENoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFscmVhZHkgdXNlZCB1cCAoPGNvZGU+MCA8PSB1c2VkQ2hhcmFjdGVycyA8PSA1MDwvY29kZT4pLgorICAgICAqIEBwYXJhbSBjaGFyc2V0CisgICAgICogICAgICAgICAgICB0aGUgSmF2YSBjaGFyc2V0IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZW5jb2RlIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgIHN0cmluZyBpbnRvIGEgYnl0ZSBhcnJheS4gQSBzdWl0YWJsZSBjaGFyc2V0IGlzIGRldGVjdGVkCisgICAgICogICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGlmIHRoaXMgcGFyYW1ldGVyIGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSBlbmNvZGluZworICAgICAqICAgICAgICAgICAgdGhlIGVuY29kaW5nIHRvIHVzZSBmb3IgdGhlIGVuY29kZWQtd29yZCAoZWl0aGVyIEIgb3IgUSkuIEEKKyAgICAgKiAgICAgICAgICAgIHN1aXRhYmxlIGVuY29kaW5nIGlzIGF1dG9tYXRpY2FsbHkgY2hvc2VuIGlmIHRoaXMgcGFyYW1ldGVyIGlzCisgICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHdvcmQgKG9yIHNlcXVlbmNlIG9mIGVuY29kZWQgd29yZHMgaWYgdGhlIGdpdmVuIHRleHQKKyAgICAgKiAgICAgICAgIGRvZXMgbm90IGZpdCBpbiBhIHNpbmdsZSBlbmNvZGVkIHdvcmQpLgorICAgICAqIEBzZWUgI2hhc1RvQmVFbmNvZGVkKFN0cmluZywgaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUVuY29kZWRXb3JkKFN0cmluZyB0ZXh0LCBVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIGludCB1c2VkQ2hhcmFjdGVycywgQ2hhcnNldCBjaGFyc2V0LCBFbmNvZGluZyBlbmNvZGluZykgeworICAgICAgICBpZiAodGV4dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBpZiAodXNlZENoYXJhY3RlcnMgPCAwIHx8IHVzZWRDaGFyYWN0ZXJzID4gTUFYX1VTRURfQ0hBUkFDVEVSUykKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAoY2hhcnNldCA9PSBudWxsKQorICAgICAgICAgICAgY2hhcnNldCA9IGRldGVybWluZUNoYXJzZXQodGV4dCk7CisKKyAgICAgICAgU3RyaW5nIG1pbWVDaGFyc2V0ID0gQ2hhcnNldFV0aWwudG9NaW1lQ2hhcnNldChjaGFyc2V0Lm5hbWUoKSk7CisgICAgICAgIGlmIChtaW1lQ2hhcnNldCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBjYW5ub3QgaGFwcGVuIGlmIGNoYXJzZXQgd2FzIG9yaWdpbmFsbHkgbnVsbAorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgY2hhcnNldCIpOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZW5jb2RlKHRleHQsIGNoYXJzZXQpOworCisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQorICAgICAgICAgICAgZW5jb2RpbmcgPSBkZXRlcm1pbmVFbmNvZGluZyhieXRlcywgdXNhZ2UpOworCisgICAgICAgIGlmIChlbmNvZGluZyA9PSBFbmNvZGluZy5CKSB7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gRU5DX1dPUkRfUFJFRklYICsgbWltZUNoYXJzZXQgKyAiP0I/IjsKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGVCKHByZWZpeCwgdGV4dCwgdXNlZENoYXJhY3RlcnMsIGNoYXJzZXQsIGJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBFTkNfV09SRF9QUkVGSVggKyBtaW1lQ2hhcnNldCArICI/UT8iOworICAgICAgICAgICAgcmV0dXJuIGVuY29kZVEocHJlZml4LCB0ZXh0LCB1c2FnZSwgdXNlZENoYXJhY3RlcnMsIGNoYXJzZXQsIGJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIHNwZWNpZmllZCBieXRlIGFycmF5IHVzaW5nIHRoZSBCIGVuY29kaW5nIGRlZmluZWQgaW4gUkZDCisgICAgICogMjA0Ny4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnl0ZXMKKyAgICAgKiAgICAgICAgICAgIGJ5dGUgYXJyYXkgdG8gZW5jb2RlLgorICAgICAqIEByZXR1cm4gZW5jb2RlZCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQihieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaW50IGlkeCA9IDA7CisgICAgICAgIGZpbmFsIGludCBlbmQgPSBieXRlcy5sZW5ndGg7CisgICAgICAgIGZvciAoOyBpZHggPCBlbmQgLSAyOyBpZHggKz0gMykgeworICAgICAgICAgICAgaW50IGRhdGEgPSAoYnl0ZXNbaWR4XSAmIDB4ZmYpIDw8IDE2IHwgKGJ5dGVzW2lkeCArIDFdICYgMHhmZikgPDwgOAorICAgICAgICAgICAgICAgICAgICB8IGJ5dGVzW2lkeCArIDJdICYgMHhmZjsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgQkFTRTY0X1RBQkxFW2RhdGEgPj4gMTggJiAweDNmXSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIEJBU0U2NF9UQUJMRVtkYXRhID4+IDEyICYgMHgzZl0pOworICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBCQVNFNjRfVEFCTEVbZGF0YSA+PiA2ICYgMHgzZl0pOworICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBCQVNFNjRfVEFCTEVbZGF0YSAmIDB4M2ZdKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpZHggPT0gZW5kIC0gMikgeworICAgICAgICAgICAgaW50IGRhdGEgPSAoYnl0ZXNbaWR4XSAmIDB4ZmYpIDw8IDE2IHwgKGJ5dGVzW2lkeCArIDFdICYgMHhmZikgPDwgODsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgQkFTRTY0X1RBQkxFW2RhdGEgPj4gMTggJiAweDNmXSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIEJBU0U2NF9UQUJMRVtkYXRhID4+IDEyICYgMHgzZl0pOworICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBCQVNFNjRfVEFCTEVbZGF0YSA+PiA2ICYgMHgzZl0pOworICAgICAgICAgICAgc2IuYXBwZW5kKEJBU0U2NF9QQUQpOworCisgICAgICAgIH0gZWxzZSBpZiAoaWR4ID09IGVuZCAtIDEpIHsKKyAgICAgICAgICAgIGludCBkYXRhID0gKGJ5dGVzW2lkeF0gJiAweGZmKSA8PCAxNjsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgQkFTRTY0X1RBQkxFW2RhdGEgPj4gMTggJiAweDNmXSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIEJBU0U2NF9UQUJMRVtkYXRhID4+IDEyICYgMHgzZl0pOworICAgICAgICAgICAgc2IuYXBwZW5kKEJBU0U2NF9QQUQpOworICAgICAgICAgICAgc2IuYXBwZW5kKEJBU0U2NF9QQUQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB0aGUgc3BlY2lmaWVkIGJ5dGUgYXJyYXkgdXNpbmcgdGhlIFEgZW5jb2RpbmcgZGVmaW5lZCBpbiBSRkMKKyAgICAgKiAyMDQ3LgorICAgICAqIAorICAgICAqIEBwYXJhbSBieXRlcworICAgICAqICAgICAgICAgICAgYnl0ZSBhcnJheSB0byBlbmNvZGUuCisgICAgICogQHBhcmFtIHVzYWdlCisgICAgICogICAgICAgICAgICB3aGV0aGVyIHRoZSBlbmNvZGVkLXdvcmQgaXMgdG8gYmUgdXNlZCB0byByZXBsYWNlIGEgdGV4dCB0b2tlbgorICAgICAqICAgICAgICAgICAgb3IgYSB3b3JkIGVudGl0eSAoc2VlIFJGQyA4MjIpLgorICAgICAqIEByZXR1cm4gZW5jb2RlZCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlUShieXRlW10gYnl0ZXMsIFVzYWdlIHVzYWdlKSB7CisgICAgICAgIEJpdFNldCBxQ2hhcnMgPSB1c2FnZSA9PSBVc2FnZS5URVhUX1RPS0VOID8gUV9SRUdVTEFSX0NIQVJTCisgICAgICAgICAgICAgICAgOiBRX1JFU1RSSUNURURfQ0hBUlM7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgZmluYWwgaW50IGVuZCA9IGJ5dGVzLmxlbmd0aDsKKyAgICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgZW5kOyBpZHgrKykgeworICAgICAgICAgICAgaW50IHYgPSBieXRlc1tpZHhdICYgMHhmZjsKKyAgICAgICAgICAgIGlmICh2ID09IDMyKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdfJyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFxQ2hhcnMuZ2V0KHYpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc9Jyk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGhleERpZ2l0KHYgPj4+IDQpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaGV4RGlnaXQodiAmIDB4ZikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIHYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHRva2VuIGFzIGRlZmluZWQgaW4gUkZDIDIwNDUKKyAgICAgKiBzZWN0aW9uIDUuMS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyCisgICAgICogICAgICAgICAgICBzdHJpbmcgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgUkZDIDIwNDUgdG9rZW4sCisgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Rva2VuKFN0cmluZyBzdHIpIHsKKyAgICAgICAgLy8gdG9rZW4gOj0gMSo8YW55IChVUy1BU0NJSSkgQ0hBUiBleGNlcHQgU1BBQ0UsIENUTHMsIG9yIHRzcGVjaWFscz4KKyAgICAgICAgLy8gdHNwZWNpYWxzIDo9ICIoIiAvICIpIiAvICI8IiAvICI+IiAvICJAIiAvICIsIiAvICI7IiAvICI6IiAvICJcIiAvCisgICAgICAgIC8vIDwiPiAvICIvIiAvICJbIiAvICJdIiAvICI/IiAvICI9IgorICAgICAgICAvLyBDVEwgOj0gMC4tIDMxLiwgMTI3LgorCisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7CisgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBsZW5ndGg7IGlkeCsrKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gc3RyLmNoYXJBdChpZHgpOworICAgICAgICAgICAgaWYgKCFUT0tFTl9DSEFSUy5nZXQoY2gpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBdG9tUGhyYXNlKFN0cmluZyBzdHIpIHsKKyAgICAgICAgLy8gYXRvbSA9IFtDRldTXSAxKmF0ZXh0IFtDRldTXQorCisgICAgICAgIGJvb2xlYW4gY29udGFpbnNBVGV4dCA9IGZhbHNlOworCisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzdHIubGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KGlkeCk7CisgICAgICAgICAgICBpZiAoQVRFWFRfQ0hBUlMuZ2V0KGNoKSkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5zQVRleHQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghQ2hhcnNldFV0aWwuaXNXaGl0ZXNwYWNlKGNoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb250YWluc0FUZXh0OworICAgIH0KKworICAgIC8vIFJGQyA1MzIyIHNlY3Rpb24gMy4yLjMKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRG90QXRvbVRleHQoU3RyaW5nIHN0cikgeworICAgICAgICAvLyBkb3QtYXRvbS10ZXh0ID0gMSphdGV4dCAqKCIuIiAxKmF0ZXh0KQorICAgICAgICAvLyBhdGV4dCA9IEFMUEhBIC8gRElHSVQgLyAiISIgLyAiIyIgLyAiJCIgLyAiJSIgLyAiJiIgLyAiJyIgLyAiKiIgLworICAgICAgICAvLyAiKyIgLyAiLSIgLyAiLyIgLyAiPSIgLyAiPyIgLyAiXiIgLyAiXyIgLyAiYCIgLyAieyIgLyAifCIgLyAifSIgLyAifiIKKworICAgICAgICBjaGFyIHByZXYgPSAnLic7CisKKyAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHN0ci5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZvciAoaW50IGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHsKKyAgICAgICAgICAgIGNoYXIgY2ggPSBzdHIuY2hhckF0KGlkeCk7CisKKyAgICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJldiA9PSAnLicgfHwgaWR4ID09IGxlbmd0aCAtIDEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFBVEVYVF9DSEFSUy5nZXQoY2gpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByZXYgPSBjaDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFJGQyA1MzIyIHNlY3Rpb24gMy4yLjQKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHN0cikgeworICAgICAgICAvLyBxdW90ZWQtc3RyaW5nID0gW0NGV1NdIERRVU9URSAqKFtGV1NdIHFjb250ZW50KSBbRldTXSBEUVVPVEUgW0NGV1NdCisgICAgICAgIC8vIHFjb250ZW50ID0gcXRleHQgLyBxdW90ZWQtcGFpcgorICAgICAgICAvLyBxdGV4dCA9ICVkMzMgLyAlZDM1LTkxIC8gJWQ5My0xMjYKKyAgICAgICAgLy8gcXVvdGVkLXBhaXIgPSAoIlwiIChWQ0hBUiAvIFdTUCkpCisgICAgICAgIC8vIFZDSEFSID0gJXgyMS03RQorICAgICAgICAvLyBEUVVPVEUgPSAleDIyCisKKyAgICAgICAgU3RyaW5nIGVzY2FwZWQgPSBzdHIucmVwbGFjZUFsbCgiW1xcXFxcIl0iLCAiXFxcXCQwIik7CisgICAgICAgIHJldHVybiAiXCIiICsgZXNjYXBlZCArICJcIiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZUIoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHRleHQsCisgICAgICAgICAgICBpbnQgdXNlZENoYXJhY3RlcnMsIENoYXJzZXQgY2hhcnNldCwgYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgIGludCBlbmNvZGVkTGVuZ3RoID0gYkVuY29kZWRMZW5ndGgoYnl0ZXMpOworCisgICAgICAgIGludCB0b3RhbExlbmd0aCA9IHByZWZpeC5sZW5ndGgoKSArIGVuY29kZWRMZW5ndGgKKyAgICAgICAgICAgICAgICArIEVOQ19XT1JEX1NVRkZJWC5sZW5ndGgoKTsKKyAgICAgICAgaWYgKHRvdGFsTGVuZ3RoIDw9IEVOQ09ERURfV09SRF9NQVhfTEVOR1RIIC0gdXNlZENoYXJhY3RlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyBlbmNvZGVCKGJ5dGVzKSArIEVOQ19XT1JEX1NVRkZJWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0MSA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLyAyKTsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlczEgPSBlbmNvZGUocGFydDEsIGNoYXJzZXQpOworICAgICAgICAgICAgU3RyaW5nIHdvcmQxID0gZW5jb2RlQihwcmVmaXgsIHBhcnQxLCB1c2VkQ2hhcmFjdGVycywgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXMxKTsKKworICAgICAgICAgICAgU3RyaW5nIHBhcnQyID0gdGV4dC5zdWJzdHJpbmcodGV4dC5sZW5ndGgoKSAvIDIpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzMiA9IGVuY29kZShwYXJ0MiwgY2hhcnNldCk7CisgICAgICAgICAgICBTdHJpbmcgd29yZDIgPSBlbmNvZGVCKHByZWZpeCwgcGFydDIsIDAsIGNoYXJzZXQsIGJ5dGVzMik7CisKKyAgICAgICAgICAgIHJldHVybiB3b3JkMSArICIgIiArIHdvcmQyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGJFbmNvZGVkTGVuZ3RoKGJ5dGVbXSBieXRlcykgeworICAgICAgICByZXR1cm4gKGJ5dGVzLmxlbmd0aCArIDIpIC8gMyAqIDQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZVEoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHRleHQsIFVzYWdlIHVzYWdlLAorICAgICAgICAgICAgaW50IHVzZWRDaGFyYWN0ZXJzLCBDaGFyc2V0IGNoYXJzZXQsIGJ5dGVbXSBieXRlcykgeworICAgICAgICBpbnQgZW5jb2RlZExlbmd0aCA9IHFFbmNvZGVkTGVuZ3RoKGJ5dGVzLCB1c2FnZSk7CisKKyAgICAgICAgaW50IHRvdGFsTGVuZ3RoID0gcHJlZml4Lmxlbmd0aCgpICsgZW5jb2RlZExlbmd0aAorICAgICAgICAgICAgICAgICsgRU5DX1dPUkRfU1VGRklYLmxlbmd0aCgpOworICAgICAgICBpZiAodG90YWxMZW5ndGggPD0gRU5DT0RFRF9XT1JEX01BWF9MRU5HVEggLSB1c2VkQ2hhcmFjdGVycykgeworICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArIGVuY29kZVEoYnl0ZXMsIHVzYWdlKSArIEVOQ19XT1JEX1NVRkZJWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0MSA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLyAyKTsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlczEgPSBlbmNvZGUocGFydDEsIGNoYXJzZXQpOworICAgICAgICAgICAgU3RyaW5nIHdvcmQxID0gZW5jb2RlUShwcmVmaXgsIHBhcnQxLCB1c2FnZSwgdXNlZENoYXJhY3RlcnMsCisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQsIGJ5dGVzMSk7CisKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0MiA9IHRleHQuc3Vic3RyaW5nKHRleHQubGVuZ3RoKCkgLyAyKTsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlczIgPSBlbmNvZGUocGFydDIsIGNoYXJzZXQpOworICAgICAgICAgICAgU3RyaW5nIHdvcmQyID0gZW5jb2RlUShwcmVmaXgsIHBhcnQyLCB1c2FnZSwgMCwgY2hhcnNldCwgYnl0ZXMyKTsKKworICAgICAgICAgICAgcmV0dXJuIHdvcmQxICsgIiAiICsgd29yZDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcUVuY29kZWRMZW5ndGgoYnl0ZVtdIGJ5dGVzLCBVc2FnZSB1c2FnZSkgeworICAgICAgICBCaXRTZXQgcUNoYXJzID0gdXNhZ2UgPT0gVXNhZ2UuVEVYVF9UT0tFTiA/IFFfUkVHVUxBUl9DSEFSUworICAgICAgICAgICAgICAgIDogUV9SRVNUUklDVEVEX0NIQVJTOworCisgICAgICAgIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgYnl0ZXMubGVuZ3RoOyBpZHgrKykgeworICAgICAgICAgICAgaW50IHYgPSBieXRlc1tpZHhdICYgMHhmZjsKKyAgICAgICAgICAgIGlmICh2ID09IDMyKSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXFDaGFycy5nZXQodikpIHsKKyAgICAgICAgICAgICAgICBjb3VudCArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBlbmNvZGUoU3RyaW5nIHRleHQsIENoYXJzZXQgY2hhcnNldCkgeworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGNoYXJzZXQuZW5jb2RlKHRleHQpOworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtidWZmZXIubGltaXQoKV07CisgICAgICAgIGJ1ZmZlci5nZXQoYnl0ZXMpOworICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldCBkZXRlcm1pbmVDaGFyc2V0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIC8vIGl0IGlzIGFuIGltcG9ydGFudCBwcm9wZXJ0eSBvZiBpc28tODg1OS0xIHRoYXQgaXQgZGlyZWN0bHkgbWFwcworICAgICAgICAvLyB1bmljb2RlIGNvZGUgcG9pbnRzIDAwMDAgdG8gMDBmZiB0byBieXRlIHZhbHVlcyAwMCB0byBmZi4KKyAgICAgICAgYm9vbGVhbiBhc2NpaSA9IHRydWU7CisgICAgICAgIGZpbmFsIGludCBsZW4gPSB0ZXh0Lmxlbmd0aCgpOworICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuOyBpbmRleCsrKSB7CisgICAgICAgICAgICBjaGFyIGNoID0gdGV4dC5jaGFyQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGNoID4gMHhmZikgeworICAgICAgICAgICAgICAgIHJldHVybiBDaGFyc2V0VXRpbC5VVEZfODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA+IDB4N2YpIHsKKyAgICAgICAgICAgICAgICBhc2NpaSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhc2NpaSA/IENoYXJzZXRVdGlsLlVTX0FTQ0lJIDogQ2hhcnNldFV0aWwuSVNPXzg4NTlfMTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBFbmNvZGluZyBkZXRlcm1pbmVFbmNvZGluZyhieXRlW10gYnl0ZXMsIFVzYWdlIHVzYWdlKSB7CisgICAgICAgIGlmIChieXRlcy5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGluZy5ROworCisgICAgICAgIEJpdFNldCBxQ2hhcnMgPSB1c2FnZSA9PSBVc2FnZS5URVhUX1RPS0VOID8gUV9SRUdVTEFSX0NIQVJTCisgICAgICAgICAgICAgICAgOiBRX1JFU1RSSUNURURfQ0hBUlM7CisKKyAgICAgICAgaW50IHFFbmNvZGVkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50IHYgPSBieXRlc1tpXSAmIDB4ZmY7CisgICAgICAgICAgICBpZiAodiAhPSAzMiAmJiAhcUNoYXJzLmdldCh2KSkgeworICAgICAgICAgICAgICAgIHFFbmNvZGVkKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgcGVyY2VudGFnZSA9IHFFbmNvZGVkICogMTAwIC8gYnl0ZXMubGVuZ3RoOworICAgICAgICByZXR1cm4gcGVyY2VudGFnZSA+IDMwID8gRW5jb2RpbmcuQiA6IEVuY29kaW5nLlE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2hhciBoZXhEaWdpdChpbnQgaSkgeworICAgICAgICByZXR1cm4gaSA8IDEwID8gKGNoYXIpIChpICsgJzAnKSA6IChjaGFyKSAoaSAtIDEwICsgJ0EnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1F1b3RlZFByaW50YWJsZUVuY29kZXIuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvUXVvdGVkUHJpbnRhYmxlRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZThhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1F1b3RlZFByaW50YWJsZUVuY29kZXIuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworZmluYWwgY2xhc3MgUXVvdGVkUHJpbnRhYmxlRW5jb2RlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBUQUIgPSAweDA5OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgU1BBQ0UgPSAweDIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgRVFVQUxTID0gMHgzRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIENSID0gMHgwRDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIExGID0gMHgwQTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIFFVT1RFRF9QUklOVEFCTEVfTEFTVF9QTEFJTiA9IDB4N0U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFFVT1RFRF9QUklOVEFCTEVfTUFYX0xJTkVfTEVOR1RIID0gNzY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFFVT1RFRF9QUklOVEFCTEVfT0NURVRTX1BFUl9FU0NBUEUgPSAzOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBIRVhfRElHSVRTID0geycwJywnMScsJzInLCczJywnNCcsJzUnLCc2JywnNycsJzgnLCc5JywnQScsJ0InLCdDJywnRCcsJ0UnLCdGJ307CisKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBpbkJ1ZmZlcjsKKyAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBvdXRCdWZmZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGJpbmFyeTsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gcGVuZGluZ1NwYWNlOworICAgIHByaXZhdGUgYm9vbGVhbiBwZW5kaW5nVGFiOworICAgIHByaXZhdGUgYm9vbGVhbiBwZW5kaW5nQ1I7CisgICAgcHJpdmF0ZSBpbnQgbmV4dFNvZnRCcmVhazsKKyAgICBwcml2YXRlIGludCBvdXRwdXRJbmRleDsKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7CisgICAgCisgICAgCisgICAgcHVibGljIFF1b3RlZFByaW50YWJsZUVuY29kZXIoaW50IGJ1ZmZlclNpemUsIGJvb2xlYW4gYmluYXJ5KSB7CisgICAgICAgIGluQnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisgICAgICAgIG91dEJ1ZmZlciA9IG5ldyBieXRlWzMqYnVmZmVyU2l6ZV07CisgICAgICAgIG91dHB1dEluZGV4ID0gMDsKKyAgICAgICAgbmV4dFNvZnRCcmVhayA9IFFVT1RFRF9QUklOVEFCTEVfTUFYX0xJTkVfTEVOR1RIICsgMTsKKyAgICAgICAgb3V0ID0gbnVsbDsKKyAgICAgICAgdGhpcy5iaW5hcnkgPSBiaW5hcnk7CisgICAgICAgIHBlbmRpbmdTcGFjZSA9IGZhbHNlOworICAgICAgICBwZW5kaW5nVGFiID0gZmFsc2U7CisgICAgICAgIHBlbmRpbmdDUiA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICB2b2lkIGluaXRFbmNvZGluZyhmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHRoaXMub3V0ID0gb3V0OworICAgICAgICBwZW5kaW5nU3BhY2UgPSBmYWxzZTsKKyAgICAgICAgcGVuZGluZ1RhYiA9IGZhbHNlOworICAgICAgICBwZW5kaW5nQ1IgPSBmYWxzZTsKKyAgICAgICAgbmV4dFNvZnRCcmVhayA9IFFVT1RFRF9QUklOVEFCTEVfTUFYX0xJTkVfTEVOR1RIICsgMTsKKyAgICB9CisgICAgCisgICAgdm9pZCBlbmNvZGVDaHVuayhieXRlW10gYnVmZmVyLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpbnB1dEluZGV4ID0gb2ZmOyBpbnB1dEluZGV4IDwgbGVuICsgb2ZmOyBpbnB1dEluZGV4KyspIHsKKyAgICAgICAgICAgIGVuY29kZShidWZmZXJbaW5wdXRJbmRleF0pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZvaWQgY29tcGxldGVFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlUGVuZGluZygpOworICAgICAgICBmbHVzaE91dHB1dCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBlbmNvZGUoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGluaXRFbmNvZGluZyhvdXQpOworICAgICAgICBpbnQgaW5wdXRMZW5ndGg7CisgICAgICAgIHdoaWxlKChpbnB1dExlbmd0aCA9IGluLnJlYWQoaW5CdWZmZXIpKSA+IC0xKSB7CisgICAgICAgICAgICBlbmNvZGVDaHVuayhpbkJ1ZmZlciwgMCwgaW5wdXRMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGNvbXBsZXRlRW5jb2RpbmcoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGVuZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwZW5kaW5nU3BhY2UpIHsKKyAgICAgICAgICAgIHBsYWluKFNQQUNFKTsKKyAgICAgICAgfSBlbHNlIGlmIChwZW5kaW5nVGFiKSB7CisgICAgICAgICAgICBwbGFpbihUQUIpOworICAgICAgICB9IGVsc2UgaWYgKHBlbmRpbmdDUikgeworICAgICAgICAgICAgcGxhaW4oQ1IpOworICAgICAgICB9CisgICAgICAgIGNsZWFyUGVuZGluZygpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2xlYXJQZW5kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcGVuZGluZ1NwYWNlICA9IGZhbHNlOworICAgICAgICBwZW5kaW5nVGFiID0gZmFsc2U7CisgICAgICAgIHBlbmRpbmdDUiA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlKGJ5dGUgbmV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5leHQgPT0gTEYpIHsKKyAgICAgICAgICAgIGlmIChiaW5hcnkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZVBlbmRpbmcoKTsKKyAgICAgICAgICAgICAgICBlc2NhcGUobmV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nQ1IpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRXhwZWN0IGVpdGhlciBzcGFjZSBvciB0YWIgcGVuZGluZyAKKyAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG5vdCBib3RoCisgICAgICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nU3BhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZShTUEFDRSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVuZGluZ1RhYikgeworICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlKFRBQik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGluZUJyZWFrKCk7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyUGVuZGluZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlUGVuZGluZygpOworICAgICAgICAgICAgICAgICAgICBwbGFpbihuZXh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSBDUikgeworICAgICAgICAgICAgaWYgKGJpbmFyeSkgIHsKKyAgICAgICAgICAgICAgICBlc2NhcGUobmV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBlbmRpbmdDUiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3cml0ZVBlbmRpbmcoKTsKKyAgICAgICAgICAgIGlmIChuZXh0ID09IFNQQUNFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpbmFyeSkgIHsKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlKG5leHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTcGFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChuZXh0ID09IFRBQikgeworICAgICAgICAgICAgICAgIGlmIChiaW5hcnkpICB7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZShuZXh0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwZW5kaW5nVGFiID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPCBTUEFDRSkgeworICAgICAgICAgICAgICAgIGVzY2FwZShuZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA+IFFVT1RFRF9QUklOVEFCTEVfTEFTVF9QTEFJTikgeworICAgICAgICAgICAgICAgIGVzY2FwZShuZXh0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PSBFUVVBTFMpIHsKKyAgICAgICAgICAgICAgICBlc2NhcGUobmV4dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBsYWluKG5leHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBwbGFpbihieXRlIG5leHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgtLW5leHRTb2Z0QnJlYWsgPD0gMSkgeworICAgICAgICAgICAgc29mdEJyZWFrKCk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGUobmV4dCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBlc2NhcGUoYnl0ZSBuZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoLS1uZXh0U29mdEJyZWFrIDw9IFFVT1RFRF9QUklOVEFCTEVfT0NURVRTX1BFUl9FU0NBUEUpIHsKKyAgICAgICAgICAgIHNvZnRCcmVhaygpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnQgbmV4dFVuc2lnbmVkID0gbmV4dCAmIDB4ZmY7CisgICAgICAgIAorICAgICAgICB3cml0ZShFUVVBTFMpOworICAgICAgICAtLW5leHRTb2Z0QnJlYWs7CisgICAgICAgIHdyaXRlKEhFWF9ESUdJVFNbbmV4dFVuc2lnbmVkID4+IDRdKTsKKyAgICAgICAgLS1uZXh0U29mdEJyZWFrOworICAgICAgICB3cml0ZShIRVhfRElHSVRTW25leHRVbnNpZ25lZCAlIDB4MTBdKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlKGJ5dGUgbmV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgb3V0QnVmZmVyW291dHB1dEluZGV4KytdID0gbmV4dDsKKyAgICAgICAgaWYgKG91dHB1dEluZGV4ID49IG91dEJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZsdXNoT3V0cHV0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHNvZnRCcmVhaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlKEVRVUFMUyk7CisgICAgICAgIGxpbmVCcmVhaygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsaW5lQnJlYWsoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShDUik7CisgICAgICAgIHdyaXRlKExGKTsKKyAgICAgICAgbmV4dFNvZnRCcmVhayA9IFFVT1RFRF9QUklOVEFCTEVfTUFYX0xJTkVfTEVOR1RIOworICAgIH0KKyAgICAKKyAgICB2b2lkIGZsdXNoT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dHB1dEluZGV4IDwgb3V0QnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgb3V0LndyaXRlKG91dEJ1ZmZlciwgMCwgb3V0cHV0SW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LndyaXRlKG91dEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgb3V0cHV0SW5kZXggPSAwOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1F1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1F1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlYTA2YwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWM7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCisNCisvKioNCisgKiBQZXJmb3JtcyBRdW90ZWQtUHJpbnRhYmxlIGRlY29kaW5nIG9uIGFuIHVuZGVybHlpbmcgc3RyZWFtLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBRdW90ZWRQcmludGFibGVJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtLmNsYXNzKTsNCisgICAgDQorICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gc3RyZWFtOw0KKyAgICBCeXRlUXVldWUgYnl0ZXEgPSBuZXcgQnl0ZVF1ZXVlKCk7DQorICAgIEJ5dGVRdWV1ZSBwdXNoYmFja3EgPSBuZXcgQnl0ZVF1ZXVlKCk7DQorICAgIHByaXZhdGUgYnl0ZSBzdGF0ZSA9IDA7DQorICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsNCisNCisgICAgcHVibGljIFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIHN0cmVhbSkgew0KKyAgICAgICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBUZXJtaW5hdGVzIFF1b3RlZC1QcmludGFibGUgY29kZWQgY29udGVudC4gVGhpcyBtZXRob2QgZG9lcyBOT1QgY2xvc2UgDQorICAgICAqIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbS4NCisgICAgICogDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gSS9PIGVycm9ycy4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoY2xvc2VkKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJRdW90ZWRQcmludGFibGVJbnB1dFN0cmVhbSBoYXMgYmVlbiBjbG9zZWQiKTsNCisgICAgICAgIH0NCisgICAgICAgIGZpbGxCdWZmZXIoKTsNCisgICAgICAgIGlmIChieXRlcS5jb3VudCgpID09IDApDQorICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgYnl0ZSB2YWwgPSBieXRlcS5kZXF1ZXVlKCk7DQorICAgICAgICAgICAgaWYgKHZhbCA+PSAwKQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsOw0KKyAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbCAmIDB4RkY7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFB1bGxzIGJ5dGVzIG91dCBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0gYW5kIHBsYWNlcyB0aGVtIGluIHRoZQ0KKyAgICAgKiBwdXNoYmFjayBxdWV1ZS4gIFRoaXMgaXMgbmVjZXNzYXJ5ICh2cy4gcmVhZGluZyBmcm9tIHRoZQ0KKyAgICAgKiB1bmRlcmx5aW5nIHN0cmVhbSBkaXJlY3RseSkgdG8gZGV0ZWN0IGFuZCBmaWx0ZXIgb3V0ICJ0cmFuc3BvcnQNCisgICAgICogcGFkZGluZyIgd2hpdGVzcGFjZSwgaS5lLiwgYWxsIHdoaXRlc3BhY2UgdGhhdCBhcHBlYXJzIGltbWVkaWF0ZWx5DQorICAgICAqIGJlZm9yZSBhIENSTEYuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVW5kZXJseWluZyBzdHJlYW0gdGhyZXcgSU9FeGNlcHRpb24uDQorICAgICAqLw0KKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVQdXNoYmFja1F1ZXVlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIC8vRGVidWcudmVyaWZ5KHB1c2hiYWNrcS5jb3VudCgpID09IDAsICJQb3B1bGF0ZVB1c2hiYWNrUXVldWUgY2FsbGVkIHdoZW4gcHVzaGJhY2sgcXVldWUgd2FzIG5vdCBlbXB0eSEiKTsNCisNCisgICAgICAgIGlmIChwdXNoYmFja3EuY291bnQoKSAhPSAwKQ0KKyAgICAgICAgICAgIHJldHVybjsNCisNCisgICAgICAgIHdoaWxlICh0cnVlKSB7DQorICAgICAgICAgICAgaW50IGkgPSBzdHJlYW0ucmVhZCgpOw0KKyAgICAgICAgICAgIHN3aXRjaCAoaSkgew0KKyAgICAgICAgICAgICAgICBjYXNlIC0xOg0KKyAgICAgICAgICAgICAgICAgICAgLy8gc3RyZWFtIGlzIGRvbmUNCisgICAgICAgICAgICAgICAgICAgIHB1c2hiYWNrcS5jbGVhcigpOyAgLy8gZGlzY2FyZCBhbnkgd2hpdGVzcGFjZSBwcmVjZWRpbmcgRU9GDQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIGNhc2UgJyAnOg0KKyAgICAgICAgICAgICAgICBjYXNlICdcdCc6DQorICAgICAgICAgICAgICAgICAgICBwdXNoYmFja3EuZW5xdWV1ZSgoYnl0ZSlpKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlICdccic6DQorICAgICAgICAgICAgICAgIGNhc2UgJ1xuJzoNCisgICAgICAgICAgICAgICAgICAgIHB1c2hiYWNrcS5jbGVhcigpOyAgLy8gZGlzY2FyZCBhbnkgd2hpdGVzcGFjZSBwcmVjZWRpbmcgRU9MDQorICAgICAgICAgICAgICAgICAgICBwdXNoYmFja3EuZW5xdWV1ZSgoYnl0ZSlpKTsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICAgICAgZGVmYXVsdDoNCisgICAgICAgICAgICAgICAgICAgIHB1c2hiYWNrcS5lbnF1ZXVlKChieXRlKWkpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ2F1c2VzIHRoZSBwdXNoYmFjayBxdWV1ZSB0byBnZXQgcG9wdWxhdGVkIGlmIGl0IGlzIGVtcHR5LCB0aGVuDQorICAgICAqIGNvbnN1bWVzIGFuZCBkZWNvZGVzIGJ5dGVzIG91dCBvZiBpdCB1bnRpbCBvbmUgb3IgbW9yZSBieXRlcyBhcmUNCisgICAgICogaW4gdGhlIGJ5dGUgcXVldWUuICBUaGlzIGRlY29kaW5nIHN0ZXAgcGVyZm9ybXMgdGhlIGFjdHVhbCBRUA0KKyAgICAgKiBkZWNvZGluZy4NCisgICAgICoNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBVbmRlcmx5aW5nIHN0cmVhbSB0aHJldyBJT0V4Y2VwdGlvbi4NCisgICAgICovDQorICAgIHByaXZhdGUgdm9pZCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGJ5dGUgbXNkQ2hhciA9IDA7ICAvLyBmaXJzdCBkaWdpdCBvZiBlc2NhcGVkIG51bQ0KKyAgICAgICAgd2hpbGUgKGJ5dGVxLmNvdW50KCkgPT0gMCkgew0KKyAgICAgICAgICAgIGlmIChwdXNoYmFja3EuY291bnQoKSA9PSAwKSB7DQorICAgICAgICAgICAgICAgIHBvcHVsYXRlUHVzaGJhY2tRdWV1ZSgpOw0KKyAgICAgICAgICAgICAgICBpZiAocHVzaGJhY2txLmNvdW50KCkgPT0gMCkNCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgYnl0ZSBiID0gcHVzaGJhY2txLmRlcXVldWUoKTsNCisNCisgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7DQorICAgICAgICAgICAgICAgIGNhc2UgMDogIC8vIHN0YXJ0IHN0YXRlLCBubyBieXRlcyBwZW5kaW5nDQorICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSAnPScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlcS5lbnF1ZXVlKGIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gc3RhdGUgcmVtYWlucyAwDQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2FzZSAxOiAgLy8gZW5jb3VudGVyZWQgIj0iIHNvIGZhcg0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gJ1xyJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMjsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGIgPj0gJzAnICYmIGIgPD0gJzknKSB8fCAoYiA+PSAnQScgJiYgYiA8PSAnRicpIHx8IChiID49ICdhJyAmJiBiIDw9ICdmJykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7DQorICAgICAgICAgICAgICAgICAgICAgICAgbXNkQ2hhciA9IGI7ICAvLyBzYXZlIHVudGlsIG5leHQgZGlnaXQgZW5jb3VudGVyZWQNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYiA9PSAnPScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAvKg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFNwZWNpYWwgY2FzZSB3aGVuID09IGlzIGVuY291bnRlcmVkLg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEVtaXQgb25lID0gYW5kIHN0YXkgaW4gdGhpcyBzdGF0ZS4NCisgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzV2FybkVuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiTWFsZm9ybWVkIE1JTUU7IGdvdCA9PSIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlcS5lbnF1ZXVlKChieXRlKSc9Jyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJNYWxmb3JtZWQgTUlNRTsgZXhwZWN0ZWQgXFxyIG9yICINCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJbMC05QS1aXSwgZ290ICIgKyBiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVxLmVucXVldWUoKGJ5dGUpJz0nKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlcS5lbnF1ZXVlKGIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDI6ICAvLyBlbmNvdW50ZXJlZCAiPVxyIiBzbyBmYXINCisgICAgICAgICAgICAgICAgICAgIGlmIChiID09ICdcbicpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCJNYWxmb3JtZWQgTUlNRTsgZXhwZWN0ZWQgIiANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChpbnQpJ1xuJyArICIsIGdvdCAiICsgYik7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlcS5lbnF1ZXVlKChieXRlKSc9Jyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXEuZW5xdWV1ZSgoYnl0ZSknXHInKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlcS5lbnF1ZXVlKGIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBjYXNlIDM6ICAvLyBlbmNvdW50ZXJlZCA9PGRpZ2l0PiBzbyBmYXI7IGV4cGVjdGluZyBhbm90aGVyIDxkaWdpdD4gdG8gY29tcGxldGUgdGhlIG9jdGV0DQorICAgICAgICAgICAgICAgICAgICBpZiAoKGIgPj0gJzAnICYmIGIgPD0gJzknKSB8fCAoYiA+PSAnQScgJiYgYiA8PSAnRicpIHx8IChiID49ICdhJyAmJiBiIDw9ICdmJykpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlIG1zZCA9IGFzY2lpQ2hhclRvTnVtZXJpY1ZhbHVlKG1zZENoYXIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgbG93ID0gYXNjaWlDaGFyVG9OdW1lcmljVmFsdWUoYik7DQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVxLmVucXVldWUoKGJ5dGUpKChtc2QgPDwgNCkgfCBsb3cpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIk1hbGZvcm1lZCBNSU1FOyBleHBlY3RlZCAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlswLTlBLVpdLCBnb3QgIiArIGIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXEuZW5xdWV1ZSgoYnl0ZSknPScpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVxLmVucXVldWUobXNkQ2hhcik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXEuZW5xdWV1ZShiKTsNCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgZGVmYXVsdDogIC8vIHNob3VsZCBuZXZlciBoYXBwZW4NCisgICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcigiSWxsZWdhbCBzdGF0ZTogIiArIHN0YXRlKTsNCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDsNCisgICAgICAgICAgICAgICAgICAgIGJ5dGVxLmVucXVldWUoYik7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnZlcnRzICcwJyA9PiAwLCAnQScgPT4gMTAsIGV0Yy4NCisgICAgICogQHBhcmFtIGMgQVNDSUkgY2hhcmFjdGVyIHZhbHVlLg0KKyAgICAgKiBAcmV0dXJuIE51bWVyaWMgdmFsdWUgb2YgaGV4YWRlY2ltYWwgY2hhcmFjdGVyLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBieXRlIGFzY2lpQ2hhclRvTnVtZXJpY1ZhbHVlKGJ5dGUgYykgew0KKyAgICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7DQorICAgICAgICAgICAgcmV0dXJuIChieXRlKShjIC0gJzAnKTsNCisgICAgICAgIH0gZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsNCisgICAgICAgICAgICByZXR1cm4gKGJ5dGUpKDB4QSArIChjIC0gJ0EnKSk7DQorICAgICAgICB9IGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7DQorICAgICAgICAgICAgcmV0dXJuIChieXRlKSgweEEgKyAoYyAtICdhJykpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAvKg0KKyAgICAgICAgICAgICAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSBhbGwgY2FsbHMgdG8gdGhpcyBtZXRob2QNCisgICAgICAgICAgICAgKiBhcmUgcHJlY2VkZWQgYnkgYSBjaGVjayB0aGF0IGMgaXMgaW4gWzAtOUEtWmEtel0NCisgICAgICAgICAgICAgKi8NCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKChjaGFyKSBjIA0KKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIGhleGFkZWNpbWFsIGRpZ2l0Iik7DQorICAgICAgICB9DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9RdW90ZWRQcmludGFibGVPdXRwdXRTdHJlYW0uamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvUXVvdGVkUHJpbnRhYmxlT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3ODM0MQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvUXVvdGVkUHJpbnRhYmxlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYzsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKKy8qKgorICogUGVyZm9ybXMgUXVvdGVkLVByaW50YWJsZSBlbmNvZGluZyBvbiBhbiB1bmRlcmx5aW5nIHN0cmVhbS4KKyAqLworcHVibGljIGNsYXNzIFF1b3RlZFByaW50YWJsZU91dHB1dFN0cmVhbSBleHRlbmRzIEZpbHRlck91dHB1dFN0cmVhbSB7CisgICAgCisgICAgcHJpdmF0ZSBRdW90ZWRQcmludGFibGVFbmNvZGVyIGVuY29kZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgcHVibGljIFF1b3RlZFByaW50YWJsZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIGJpbmFyeSkgeworICAgICAgICBzdXBlcihvdXQpOworICAgICAgICBlbmNvZGVyID0gbmV3IFF1b3RlZFByaW50YWJsZUVuY29kZXIoQ29kZWNVdGlsLkRFRkFVTFRfRU5DT0RJTkdfQlVGRkVSX1NJWkUsIGJpbmFyeSk7CisgICAgICAgIGVuY29kZXIuaW5pdEVuY29kaW5nKG91dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY2xvc2VkKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbmNvZGVyLmNvbXBsZXRlRW5jb2RpbmcoKTsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBjbG9zZSB0aGUgd3JhcHBlZCBzdHJlYW0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGVuY29kZXIuZmx1c2hPdXRwdXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy53cml0ZShuZXcgYnl0ZVtdIHsgKGJ5dGUpIGIgfSwgMCwgMSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUXVvdGVkUHJpbnRhYmxlT3V0cHV0U3RyZWFtIGhhcyBiZWVuIGNsb3NlZCIpOworICAgICAgICB9CisKKyAgICAgICAgZW5jb2Rlci5lbmNvZGVDaHVuayhiLCBvZmYsIGxlbik7CisgICAgfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9VbmJvdW5kZWRGaWZvQnl0ZUJ1ZmZlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9VbmJvdW5kZWRGaWZvQnl0ZUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMDhkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1VuYm91bmRlZEZpZm9CeXRlQnVmZmVyLmphdmEKQEAgLTAsMCArMSwyNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQoraW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOw0KKw0KKy8qKg0KKyAqIFVuYm91bmRlZEZpZm9CeXRlQnVmZmVyIGlzIGEgdmVyeSBlZmZpY2llbnQgYnVmZmVyIGltcGxlbWVudGF0aW9uLg0KKyAqIEFjY29yZGluZyB0byBwZXJmb3JtYW5jZSB0ZXN0aW5nLCBpdCBleGhpYml0cyBhIGNvbnN0YW50IGFjY2VzcyB0aW1lLCBidXQgaXQNCisgKiBhbHNvIG91dHBlcmZvcm1zIEFycmF5TGlzdCB3aGVuIHVzZWQgZm9yIHRoZSBzYW1lIHB1cnBvc2UuDQorICogPHA+DQorICogVGhlIHJlbW92YWwgb3JkZXIgb2YgYW4gPGNvZGU+VW5ib3VuZGVkRmlmb0J5dGVCdWZmZXI8L2NvZGU+IGlzIGJhc2VkIG9uIHRoZSBpbnNlcnRpb24NCisgKiBvcmRlcjsgZWxlbWVudHMgYXJlIHJlbW92ZWQgaW4gdGhlIHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkLg0KKyAqIFRoZSBpdGVyYXRpb24gb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIHJlbW92YWwgb3JkZXIuDQorICogPHA+DQorICogVGhlIHtAbGluayAjcmVtb3ZlKCl9IGFuZCB7QGxpbmsgI2dldCgpfSBvcGVyYXRpb25zIHBlcmZvcm0gaW4gY29uc3RhbnQgdGltZS4NCisgKiBUaGUge0BsaW5rICNhZGQoT2JqZWN0KX0gb3BlcmF0aW9uIHBlcmZvcm1zIGluIGFtb3J0aXplZCBjb25zdGFudCB0aW1lLiAgQWxsDQorICogb3RoZXIgb3BlcmF0aW9ucyBwZXJmb3JtIGluIGxpbmVhciB0aW1lIG9yIHdvcnNlLg0KKyAqIDxwPg0KKyAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBzeW5jaHJvbml6ZWQuICBUaGUgZm9sbG93aW5nIGNhbiBiZQ0KKyAqIHVzZWQgdG8gcHJvdmlkZSBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIHlvdXIgPGNvZGU+VW5ib3VuZGVkRmlmb0J5dGVCdWZmZXI8L2NvZGU+Og0KKyAqIDxwcmU+DQorICogICBCdWZmZXIgZmlmbyA9IEJ1ZmZlclV0aWxzLnN5bmNocm9uaXplZEJ1ZmZlcihuZXcgVW5ib3VuZGVkRmlmb0J5dGVCdWZmZXIoKSk7DQorICogPC9wcmU+DQorICogPHA+DQorICogVGhpcyBidWZmZXIgcHJldmVudHMgbnVsbCBvYmplY3RzIGZyb20gYmVpbmcgYWRkZWQuDQorICoNCisgKiBAc2luY2UgQ29tbW9ucyBDb2xsZWN0aW9ucyAzLjAgKHByZXZpb3VzbHkgaW4gbWFpbiBwYWNrYWdlIHYyLjEpDQorICovDQorY2xhc3MgVW5ib3VuZGVkRmlmb0J5dGVCdWZmZXIgew0KKw0KKyAgICBwcm90ZWN0ZWQgYnl0ZVtdIGJ1ZmZlcjsNCisgICAgcHJvdGVjdGVkIGludCBoZWFkOw0KKyAgICBwcm90ZWN0ZWQgaW50IHRhaWw7DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFVuYm91bmRlZEZpZm9CeXRlQnVmZmVyIHdpdGggdGhlIGRlZmF1bHQgbnVtYmVyIG9mIGVsZW1lbnRzLg0KKyAgICAgKiBJdCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHBlcmZvcm1pbmcgdGhlIGZvbGxvd2luZzoNCisgICAgICoNCisgICAgICogPHByZT4NCisgICAgICogICBuZXcgVW5ib3VuZGVkRmlmb0J5dGVCdWZmZXIoMzIpOw0KKyAgICAgKiA8L3ByZT4NCisgICAgICovDQorICAgIHB1YmxpYyBVbmJvdW5kZWRGaWZvQnl0ZUJ1ZmZlcigpIHsNCisgICAgICAgIHRoaXMoMzIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb25zdHJ1Y3RzIGFuIFVuYm91bmRlZEZpZm9CeXRlQnVmZmVyIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMuDQorICAgICAqIFRoZSBpbnRlZ2VyIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gaW5pdGlhbFNpemUgIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGJ1ZmZlcg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYgdGhlIHNpemUgaXMgbGVzcyB0aGFuIDENCisgICAgICovDQorICAgIHB1YmxpYyBVbmJvdW5kZWRGaWZvQnl0ZUJ1ZmZlcihpbnQgaW5pdGlhbFNpemUpIHsNCisgICAgICAgIGlmIChpbml0aWFsU2l6ZSA8PSAwKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbaW5pdGlhbFNpemUgKyAxXTsNCisgICAgICAgIGhlYWQgPSAwOw0KKyAgICAgICAgdGFpbCA9IDA7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQgaW4gdGhlIGJ1ZmZlci4NCisgICAgICoNCisgICAgICogQHJldHVybiB0aGlzIGJ1ZmZlcidzIHNpemUNCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsNCisgICAgICAgIGludCBzaXplID0gMDsNCisNCisgICAgICAgIGlmICh0YWlsIDwgaGVhZCkgew0KKyAgICAgICAgICAgIHNpemUgPSBidWZmZXIubGVuZ3RoIC0gaGVhZCArIHRhaWw7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHNpemUgPSB0YWlsIC0gaGVhZDsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBzaXplOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBidWZmZXIgaXMgZW1wdHk7IGZhbHNlIG90aGVyd2lzZS4NCisgICAgICoNCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5DQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgew0KKyAgICAgICAgcmV0dXJuIChzaXplKCkgPT0gMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZHMgdGhlIGdpdmVuIGVsZW1lbnQgdG8gdGhpcyBidWZmZXIuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBiICB0aGUgYnl0ZSB0byBhZGQNCisgICAgICogQHJldHVybiB0cnVlLCBhbHdheXMNCisgICAgICovDQorICAgIHB1YmxpYyBib29sZWFuIGFkZChmaW5hbCBieXRlIGIpIHsNCisNCisgICAgICAgIGlmIChzaXplKCkgKyAxID49IGJ1ZmZlci5sZW5ndGgpIHsNCisgICAgICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbKChidWZmZXIubGVuZ3RoIC0gMSkgKiAyKSArIDFdOw0KKw0KKyAgICAgICAgICAgIGludCBqID0gMDsNCisgICAgICAgICAgICBmb3IgKGludCBpID0gaGVhZDsgaSAhPSB0YWlsOykgew0KKyAgICAgICAgICAgICAgICB0bXBbal0gPSBidWZmZXJbaV07DQorICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IDA7DQorDQorICAgICAgICAgICAgICAgIGorKzsNCisgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBidWZmZXIubGVuZ3RoKSB7DQorICAgICAgICAgICAgICAgICAgICBpID0gMDsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBidWZmZXIgPSB0bXA7DQorICAgICAgICAgICAgaGVhZCA9IDA7DQorICAgICAgICAgICAgdGFpbCA9IGo7DQorICAgICAgICB9DQorDQorICAgICAgICBidWZmZXJbdGFpbF0gPSBiOw0KKyAgICAgICAgdGFpbCsrOw0KKyAgICAgICAgaWYgKHRhaWwgPj0gYnVmZmVyLmxlbmd0aCkgew0KKyAgICAgICAgICAgIHRhaWwgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIG5leHQgb2JqZWN0IGluIHRoZSBidWZmZXIuDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIG5leHQgb2JqZWN0IGluIHRoZSBidWZmZXINCisgICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5DQorICAgICAqLw0KKyAgICBwdWJsaWMgYnl0ZSBnZXQoKSB7DQorICAgICAgICBpZiAoaXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGVtcHR5Iik7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gYnVmZmVyW2hlYWRdOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZW1vdmVzIHRoZSBuZXh0IG9iamVjdCBmcm9tIHRoZSBidWZmZXINCisgICAgICoNCisgICAgICogQHJldHVybiB0aGUgcmVtb3ZlZCBvYmplY3QNCisgICAgICogQHRocm93cyBCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gIGlmIHRoaXMgYnVmZmVyIGlzIGVtcHR5DQorICAgICAqLw0KKyAgICBwdWJsaWMgYnl0ZSByZW1vdmUoKSB7DQorICAgICAgICBpZiAoaXNFbXB0eSgpKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGJ1ZmZlciBpcyBhbHJlYWR5IGVtcHR5Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBieXRlIGVsZW1lbnQgPSBidWZmZXJbaGVhZF07DQorDQorICAgICAgICBoZWFkKys7DQorICAgICAgICBpZiAoaGVhZCA+PSBidWZmZXIubGVuZ3RoKSB7DQorICAgICAgICAgICAgaGVhZCA9IDA7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gZWxlbWVudDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogSW5jcmVtZW50cyB0aGUgaW50ZXJuYWwgaW5kZXguDQorICAgICAqDQorICAgICAqIEBwYXJhbSBpbmRleCAgdGhlIGluZGV4IHRvIGluY3JlbWVudA0KKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGluZGV4DQorICAgICAqLw0KKyAgICBwcml2YXRlIGludCBpbmNyZW1lbnQoaW50IGluZGV4KSB7DQorICAgICAgICBpbmRleCsrOw0KKyAgICAgICAgaWYgKGluZGV4ID49IGJ1ZmZlci5sZW5ndGgpIHsNCisgICAgICAgICAgICBpbmRleCA9IDA7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gaW5kZXg7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIERlY3JlbWVudHMgdGhlIGludGVybmFsIGluZGV4Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gaW5kZXggIHRoZSBpbmRleCB0byBkZWNyZW1lbnQNCisgICAgICogQHJldHVybiB0aGUgdXBkYXRlZCBpbmRleA0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBpbnQgZGVjcmVtZW50KGludCBpbmRleCkgew0KKyAgICAgICAgaW5kZXgtLTsNCisgICAgICAgIGlmIChpbmRleCA8IDApIHsNCisgICAgICAgICAgICBpbmRleCA9IGJ1ZmZlci5sZW5ndGggLSAxOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGluZGV4Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhpcyBidWZmZXIncyBlbGVtZW50cy4NCisgICAgICoNCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoaXMgYnVmZmVyJ3MgZWxlbWVudHMNCisgICAgICovDQorICAgIHB1YmxpYyBJdGVyYXRvcjxCeXRlPiBpdGVyYXRvcigpIHsNCisgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8Qnl0ZT4oKSB7DQorDQorICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSBoZWFkOw0KKyAgICAgICAgICAgIHByaXZhdGUgaW50IGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7DQorDQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9IHRhaWw7DQorDQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHB1YmxpYyBCeXRlIG5leHQoKSB7DQorICAgICAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKSB7DQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gaW5kZXg7DQorICAgICAgICAgICAgICAgIGluZGV4ID0gaW5jcmVtZW50KGluZGV4KTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlKGJ1ZmZlcltsYXN0UmV0dXJuZWRJbmRleF0pOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7DQorICAgICAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWRJbmRleCA9PSAtMSkgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIC8vIEZpcnN0IGVsZW1lbnQgY2FuIGJlIHJlbW92ZWQgcXVpY2tseQ0KKyAgICAgICAgICAgICAgICBpZiAobGFzdFJldHVybmVkSW5kZXggPT0gaGVhZCkgew0KKyAgICAgICAgICAgICAgICAgICAgVW5ib3VuZGVkRmlmb0J5dGVCdWZmZXIudGhpcy5yZW1vdmUoKTsNCisgICAgICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7DQorICAgICAgICAgICAgICAgICAgICByZXR1cm47DQorICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgLy8gT3RoZXIgZWxlbWVudHMgcmVxdWlyZSB1cyB0byBzaGlmdCB0aGUgc3Vic2VxdWVudCBlbGVtZW50cw0KKyAgICAgICAgICAgICAgICBpbnQgaSA9IGxhc3RSZXR1cm5lZEluZGV4ICsgMTsNCisgICAgICAgICAgICAgICAgd2hpbGUgKGkgIT0gdGFpbCkgew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gYnVmZmVyLmxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpIC0gMV0gPSBidWZmZXJbMF07DQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDA7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltpIC0gMV0gPSBidWZmZXJbaV07DQorICAgICAgICAgICAgICAgICAgICAgICAgaSsrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGxhc3RSZXR1cm5lZEluZGV4ID0gLTE7DQorICAgICAgICAgICAgICAgIHRhaWwgPSBkZWNyZW1lbnQodGFpbCk7DQorICAgICAgICAgICAgICAgIGJ1ZmZlclt0YWlsXSA9IDA7DQorICAgICAgICAgICAgICAgIGluZGV4ID0gZGVjcmVtZW50KGluZGV4KTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICB9Ow0KKyAgICB9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9Cb2R5RGVzY3JpcHRvci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9kZXNjcmlwdG9yL0JvZHlEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3OTUyZQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9Cb2R5RGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3I7DQorDQorLyoqDQorICogRW5jYXBzdWxhdGVzIHRoZSB2YWx1ZXMgb2YgdGhlIE1JTUUtc3BlY2lmaWMgaGVhZGVyIGZpZWxkcyANCisgKiAod2hpY2ggc3RhcnRzIHdpdGggPGNvZGU+Q29udGVudC08L2NvZGU+KS4gDQorICovDQorcHVibGljIGludGVyZmFjZSBCb2R5RGVzY3JpcHRvciBleHRlbmRzIENvbnRlbnREZXNjcmlwdG9yIHsNCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGJvZHkgZGVzY3JpcHRvcnMgYm91bmRhcnkuDQorICAgICAqIEByZXR1cm4gQm91bmRhcnkgc3RyaW5nLCBpZiBrbm93biwgb3IgbnVsbC4gVGhlIGxhdHRlciBtYXkgYmUgdGhlDQorICAgICAqICAgY2FzZSwgaW4gcGFydGljdWxhciwgaWYgdGhlIGJvZHkgaXMgbm8gbXVsdGlwYXJ0IGVudGl0eS4NCisgICAgICovDQorICAgIFN0cmluZyBnZXRCb3VuZGFyeSgpOw0KKw0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvQ29udGVudERlc2NyaXB0b3IuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9Db250ZW50RGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NTQ2OGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvQ29udGVudERlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFJlcHJlc2VudHMgY29tbW9uIGNvbnRlbnQgcHJvcGVydGllcy4gCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29udGVudERlc2NyaXB0b3IgeworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYm9keSBkZXNjcmlwdG9ycyBNSU1FIHR5cGUuCisgICAgICogQHNlZSAjZ2V0TWVkaWFUeXBlKCkKKyAgICAgKiBAc2VlICNnZXRTdWJUeXBlKCkKKyAgICAgKiBAcmV0dXJuIFRoZSBNSU1FIHR5cGUsIHdoaWNoIGhhcyBiZWVuIHBhcnNlZCBmcm9tIHRoZQorICAgICAqICAgY29udGVudC10eXBlIGRlZmluaXRpb24uIE11c3Qgbm90IGJlIG51bGwsIGJ1dAorICAgICAqICAgInRleHQvcGxhaW4iLCBpZiBubyBjb250ZW50LXR5cGUgd2FzIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TWltZVR5cGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0ZWQgTUlNRSBtZWRpYSB0eXBlIGZvciB0aGlzIGNvbnRlbnQuCisgICAgICogRm9yIGV4YW1wbGUgPGNvZGU+VEVYVDwvY29kZT4sIDxjb2RlPklNQUdFPC9jb2RlPiwgPGNvZGU+TVVMVElQQVJUPC9jb2RlPgorICAgICAqIEBzZWUgI2dldE1pbWVUeXBlKCkKKyAgICAgKiBAcmV0dXJuIHRoZSBNSU1FIG1lZGlhIHR5cGUgd2hlbiBjb250ZW50LXR5cGUgc3BlY2lmaWVkLAorICAgICAqIG90aGVyd2lzZSB0aGUgY29ycmVjdCBkZWZhdWx0ICg8Y29kZT5URVhUPC9jb2RlPikKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TWVkaWFUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBkZWZhdWx0ZWQgTUlNRSBzdWIgdHlwZSBmb3IgdGhpcyBjb250ZW50LgorICAgICAqIEBzZWUgI2dldE1pbWVUeXBlKCkKKyAgICAgKiBAcmV0dXJuIHRoZSBNSU1FIG1lZGlhIHR5cGUgd2hlbiBjb250ZW50LXR5cGUgaXMgc3BlY2lmaWVkLAorICAgICAqIG90aGVyd2lzZSB0aGUgY29ycmVjdCBkZWZhdWx0ICg8Y29kZT5QTEFJTjwvY29kZT4pCisgICAgICovCisgICAgU3RyaW5nIGdldFN1YlR5cGUoKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYm9keSBkZXNjcmlwdG9ycyBjaGFyYWN0ZXIgc2V0LCBkZWZhdWx0ZWQgYXBwcm9wcmlhdGVseSBmb3IgdGhlIE1JTUUgdHlwZS48L3A+CisgICAgICogPHA+CisgICAgICogRm9yIDxjb2RlPlRFWFQ8L2NvZGU+IHR5cGVzLCB0aGlzIHdpbGwgYmUgZGVmYXVsdGVkIHRvIDxjb2RlPnVzLWFzY2lpPC9jb2RlPi4KKyAgICAgKiBGb3Igb3RoZXIgdHlwZXMsIHdoZW4gdGhlIGNoYXJzZXQgcGFyYW1ldGVyIGlzIG1pc3NpbmcgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIG51bGwuCisgICAgICogPC9wPgorICAgICAqIEByZXR1cm4gQ2hhcmFjdGVyIHNldCwgd2hpY2ggaGFzIGJlZW4gcGFyc2VkIGZyb20gdGhlCisgICAgICogICBjb250ZW50LXR5cGUgZGVmaW5pdGlvbi4gTm90IG51bGwgZm9yIDxjb2RlPlRFWFQ8L2NvZGU+IHR5cGVzLCB3aGVuIHVuc2V0IHdpbGwKKyAgICAgKiAgIGJlIHNldCB0byBkZWZhdWx0IDxjb2RlPnVzLWFzY2lpPC9jb2RlPi4gRm9yIG90aGVyIHR5cGVzLCB3aGVuIHVuc2V0LAorICAgICAqICAgbnVsbCB3aWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIFN0cmluZyBnZXRDaGFyc2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBib2R5IGRlc2NyaXB0b3JzIHRyYW5zZmVyIGVuY29kaW5nLgorICAgICAqIEByZXR1cm4gVGhlIHRyYW5zZmVyIGVuY29kaW5nLiBNdXN0IG5vdCBiZSBudWxsLCBidXQgIjdiaXQiLAorICAgICAqICAgaWYgbm8gdHJhbnNmZXItZW5jb2Rpbmcgd2FzIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0VHJhbnNmZXJFbmNvZGluZygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWFwIG9mIHBhcmFtZXRlcnMgb2YgdGhlIGNvbnRlbnQtdHlwZSBoZWFkZXIuCisgICAgICovCisgICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRDb250ZW50VHlwZVBhcmFtZXRlcnMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJvZHkgZGVzY3JpcHRvcnMgY29udGVudC1sZW5ndGguCisgICAgICogQHJldHVybiBDb250ZW50IGxlbmd0aCwgaWYga25vd24sIG9yIC0xLCB0byBpbmRpY2F0ZSB0aGUgYWJzZW5jZSBvZiBhCisgICAgICogICBjb250ZW50LWxlbmd0aCBoZWFkZXIuCisgICAgICovCisgICAgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCk7CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9EZWZhdWx0Qm9keURlc2NyaXB0b3IuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9EZWZhdWx0Qm9keURlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ5ZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9kZXNjcmlwdG9yL0RlZmF1bHRCb2R5RGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRmllbGQ7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuTWltZVV0aWw7DQorDQorLyoqDQorICogRW5jYXBzdWxhdGVzIHRoZSB2YWx1ZXMgb2YgdGhlIE1JTUUtc3BlY2lmaWMgaGVhZGVyIGZpZWxkcyANCisgKiAod2hpY2ggc3RhcnRzIHdpdGggPGNvZGU+Q29udGVudC08L2NvZGU+KS4gDQorICovDQorcHVibGljIGNsYXNzIERlZmF1bHRCb2R5RGVzY3JpcHRvciBpbXBsZW1lbnRzIE11dGFibGVCb2R5RGVzY3JpcHRvciB7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU19BU0NJSSA9ICJ1cy1hc2NpaSI7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9FTUFJTCA9ICJyZmM4MjIiOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVFlQRV9URVhUID0gInRleHQiOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfVFlQRV9NRVNTQUdFID0gIm1lc3NhZ2UiOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1BSUxfTUVTU0FHRV9NSU1FX1RZUEUgPSBNRURJQV9UWVBFX01FU1NBR0UgKyAiLyIgKyBTVUJfVFlQRV9FTUFJTDsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VCX1RZUEUgPSAicGxhaW4iOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NRURJQV9UWVBFID0gTUVESUFfVFlQRV9URVhUOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NSU1FX1RZUEUgPSBERUZBVUxUX01FRElBX1RZUEUgKyAiLyIgKyBERUZBVUxUX1NVQl9UWVBFOw0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coRGVmYXVsdEJvZHlEZXNjcmlwdG9yLmNsYXNzKTsNCisgICAgDQorICAgIHByaXZhdGUgU3RyaW5nIG1lZGlhVHlwZSA9IERFRkFVTFRfTUVESUFfVFlQRTsNCisgICAgcHJpdmF0ZSBTdHJpbmcgc3ViVHlwZSA9IERFRkFVTFRfU1VCX1RZUEU7DQorICAgIHByaXZhdGUgU3RyaW5nIG1pbWVUeXBlID0gREVGQVVMVF9NSU1FX1RZUEU7DQorICAgIHByaXZhdGUgU3RyaW5nIGJvdW5kYXJ5ID0gbnVsbDsNCisgICAgcHJpdmF0ZSBTdHJpbmcgY2hhcnNldCA9IFVTX0FTQ0lJOw0KKyAgICBwcml2YXRlIFN0cmluZyB0cmFuc2ZlckVuY29kaW5nID0gIjdiaXQiOw0KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGVudFR5cGVTZXQ7DQorICAgIHByaXZhdGUgYm9vbGVhbiBjb250ZW50VHJhbnNmZXJFbmNTZXQ7DQorICAgIHByaXZhdGUgbG9uZyBjb250ZW50TGVuZ3RoID0gLTE7DQorICAgIA0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyByb290IDxjb2RlPkJvZHlEZXNjcmlwdG9yPC9jb2RlPiBpbnN0YW5jZS4NCisgICAgICovDQorICAgIHB1YmxpYyBEZWZhdWx0Qm9keURlc2NyaXB0b3IoKSB7DQorICAgICAgICB0aGlzKG51bGwpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJvZHlEZXNjcmlwdG9yPC9jb2RlPiBpbnN0YW5jZS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHBhcmVudCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzDQorICAgICAqICAgICAgICBpcyB0aGUgcm9vdCBkZXNjcmlwdG9yLg0KKyAgICAgKi8NCisgICAgcHVibGljIERlZmF1bHRCb2R5RGVzY3JpcHRvcihCb2R5RGVzY3JpcHRvciBwYXJlbnQpIHsNCisgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiBNaW1lVXRpbC5pc1NhbWVNaW1lVHlwZSgibXVsdGlwYXJ0L2RpZ2VzdCIsIHBhcmVudC5nZXRNaW1lVHlwZSgpKSkgew0KKyAgICAgICAgICAgIG1pbWVUeXBlID0gRU1BSUxfTUVTU0FHRV9NSU1FX1RZUEU7DQorICAgICAgICAgICAgc3ViVHlwZSA9IFNVQl9UWVBFX0VNQUlMOw0KKyAgICAgICAgICAgIG1lZGlhVHlwZSA9IE1FRElBX1RZUEVfTUVTU0FHRTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbWltZVR5cGUgPSBERUZBVUxUX01JTUVfVFlQRTsNCisgICAgICAgICAgICBzdWJUeXBlID0gREVGQVVMVF9TVUJfVFlQRTsNCisgICAgICAgICAgICBtZWRpYVR5cGUgPSBERUZBVUxUX01FRElBX1RZUEU7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIDxjb2RlPkNvbnRlbnQtPC9jb2RlPiBoZWFkZXIgZmllbGQgb2YgDQorICAgICAqIGEgTUlNRSBtZXNzYWdlIG9yIHBhcnQuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gZmllbGQgdGhlIE1JTUUgZmllbGQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBhZGRGaWVsZChGaWVsZCBmaWVsZCkgew0KKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWVsZC5nZXROYW1lKCk7DQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWVsZC5nZXRCb2R5KCk7DQorDQorICAgICAgICBuYW1lID0gbmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsNCisgICAgICAgIA0KKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nIikgJiYgIWNvbnRlbnRUcmFuc2ZlckVuY1NldCkgew0KKyAgICAgICAgICAgIGNvbnRlbnRUcmFuc2ZlckVuY1NldCA9IHRydWU7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKTsNCisgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7DQorICAgICAgICAgICAgICAgIHRyYW5zZmVyRW5jb2RpbmcgPSB2YWx1ZTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgDQorICAgICAgICB9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJjb250ZW50LWxlbmd0aCIpICYmIGNvbnRlbnRMZW5ndGggPT0gLTEpIHsNCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICBjb250ZW50TGVuZ3RoID0gTG9uZy5wYXJzZUxvbmcodmFsdWUudHJpbSgpKTsNCisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkludmFsaWQgY29udGVudC1sZW5ndGg6ICIgKyB2YWx1ZSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmIChuYW1lLmVxdWFscygiY29udGVudC10eXBlIikgJiYgIWNvbnRlbnRUeXBlU2V0KSB7DQorICAgICAgICAgICAgcGFyc2VDb250ZW50VHlwZSh2YWx1ZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQ29udGVudFR5cGUoU3RyaW5nIHZhbHVlKSB7DQorICAgICAgICBjb250ZW50VHlwZVNldCA9IHRydWU7DQorICAgICAgICANCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gTWltZVV0aWwuZ2V0SGVhZGVyUGFyYW1zKHZhbHVlKTsNCisgICAgICAgIA0KKyAgICAgICAgU3RyaW5nIG1haW4gPSBwYXJhbXMuZ2V0KCIiKTsNCisgICAgICAgIFN0cmluZyB0eXBlID0gbnVsbDsNCisgICAgICAgIFN0cmluZyBzdWJ0eXBlID0gbnVsbDsNCisgICAgICAgIGlmIChtYWluICE9IG51bGwpIHsNCisgICAgICAgICAgICBtYWluID0gbWFpbi50b0xvd2VyQ2FzZSgpLnRyaW0oKTsNCisgICAgICAgICAgICBpbnQgaW5kZXggPSBtYWluLmluZGV4T2YoJy8nKTsNCisgICAgICAgICAgICBib29sZWFuIHZhbGlkID0gZmFsc2U7DQorICAgICAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7DQorICAgICAgICAgICAgICAgIHR5cGUgPSBtYWluLnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpOw0KKyAgICAgICAgICAgICAgICBzdWJ0eXBlID0gbWFpbi5zdWJzdHJpbmcoaW5kZXggKyAxKS50cmltKCk7DQorICAgICAgICAgICAgICAgIGlmICh0eXBlLmxlbmd0aCgpID4gMCAmJiBzdWJ0eXBlLmxlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICAgICAgbWFpbiA9IHR5cGUgKyAiLyIgKyBzdWJ0eXBlOw0KKyAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIGlmICghdmFsaWQpIHsNCisgICAgICAgICAgICAgICAgbWFpbiA9IG51bGw7DQorICAgICAgICAgICAgICAgIHR5cGUgPSBudWxsOw0KKyAgICAgICAgICAgICAgICBzdWJ0eXBlID0gbnVsbDsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBTdHJpbmcgYiA9IHBhcmFtcy5nZXQoImJvdW5kYXJ5Iik7DQorICAgICAgICANCisgICAgICAgIGlmIChtYWluICE9IG51bGwgDQorICAgICAgICAgICAgICAgICYmICgobWFpbi5zdGFydHNXaXRoKCJtdWx0aXBhcnQvIikgJiYgYiAhPSBudWxsKSANCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbWFpbi5zdGFydHNXaXRoKCJtdWx0aXBhcnQvIikpKSB7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgbWltZVR5cGUgPSBtYWluOw0KKyAgICAgICAgICAgIHRoaXMuc3ViVHlwZSA9IHN1YnR5cGU7DQorICAgICAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSB0eXBlOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAoTWltZVV0aWwuaXNNdWx0aXBhcnQobWltZVR5cGUpKSB7DQorICAgICAgICAgICAgYm91bmRhcnkgPSBiOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBTdHJpbmcgYyA9IHBhcmFtcy5nZXQoImNoYXJzZXQiKTsNCisgICAgICAgIGNoYXJzZXQgPSBudWxsOw0KKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGMgPSBjLnRyaW0oKTsNCisgICAgICAgICAgICBpZiAoYy5sZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgY2hhcnNldCA9IGMudG9Mb3dlckNhc2UoKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAoY2hhcnNldCA9PSBudWxsICYmIE1FRElBX1RZUEVfVEVYVC5lcXVhbHMobWVkaWFUeXBlKSkgew0KKyAgICAgICAgICAgIGNoYXJzZXQgPSBVU19BU0NJSTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgLyoNCisgICAgICAgICAqIEFkZCBhbGwgb3RoZXIgcGFyYW1ldGVycyB0byBwYXJhbWV0ZXJzLg0KKyAgICAgICAgICovDQorICAgICAgICBwYXJhbWV0ZXJzLnB1dEFsbChwYXJhbXMpOw0KKyAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUoIiIpOw0KKyAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUoImJvdW5kYXJ5Iik7DQorICAgICAgICBwYXJhbWV0ZXJzLnJlbW92ZSgiY2hhcnNldCIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gdGhlIE1pbWVUeXBlIA0KKyAgICAgKiANCisgICAgICogQHJldHVybiBtaW1lVHlwZQ0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsNCisgICAgICAgIHJldHVybiBtaW1lVHlwZTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIFJldHVybiB0aGUgYm91bmRhcnkNCisgICAgICogDQorICAgICAqIEByZXR1cm4gYm91bmRhcnkNCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm91bmRhcnkoKSB7DQorICAgICAgICByZXR1cm4gYm91bmRhcnk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gdGhlIGNoYXJzZXQNCisgICAgICogDQorICAgICAqIEByZXR1cm4gY2hhcnNldA0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgew0KKyAgICAgICAgcmV0dXJuIGNoYXJzZXQ7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gYWxsIHBhcmFtZXRlcnMgZm9yIHRoZSBCb2R5RGVzY3JpcHRvcg0KKyAgICAgKiANCisgICAgICogQHJldHVybiBwYXJhbWV0ZXJzDQorICAgICAqLw0KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRDb250ZW50VHlwZVBhcmFtZXRlcnMoKSB7DQorICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIFJldHVybiB0aGUgVHJhbnNmZXJFbmNvZGluZw0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0cmFuc2ZlckVuY29kaW5nDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRyYW5zZmVyRW5jb2RpbmcoKSB7DQorICAgICAgICByZXR1cm4gdHJhbnNmZXJFbmNvZGluZzsNCisgICAgfQ0KKyAgICANCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICByZXR1cm4gbWltZVR5cGU7DQorICAgIH0NCisNCisgICAgcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsNCisgICAgICAgIHJldHVybiBjb250ZW50TGVuZ3RoOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVkaWFUeXBlKCkgew0KKyAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1YlR5cGUoKSB7DQorICAgICAgICByZXR1cm4gc3ViVHlwZTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvTWF4aW1hbEJvZHlEZXNjcmlwdG9yLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvTWF4aW1hbEJvZHlEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3NDgyOQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9NYXhpbWFsQm9keURlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDQ2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yOworCitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmRhdGV0aW1lLkRhdGVUaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmRhdGV0aW1lLnBhcnNlci5EYXRlVGltZVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5kYXRldGltZS5wYXJzZXIuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQubGFuZ3VhZ2UucGFyc2VyLkNvbnRlbnRMYW5ndWFnZVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5taW1ldmVyc2lvbi5wYXJzZXIuTWltZVZlcnNpb25QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuc3RydWN0dXJlZC5wYXJzZXIuU3RydWN0dXJlZEZpZWxkUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLk1pbWVVdGlsOworCisvKioKKyAqIFBhcnNlcyBhbmQgc3RvcmVzIHZhbHVlcyBmb3Igc3RhbmRhcmQgTUlNRSBoZWFkZXIgdmFsdWVzLgorICogCisgKi8KK3B1YmxpYyBjbGFzcyBNYXhpbWFsQm9keURlc2NyaXB0b3IgZXh0ZW5kcyBEZWZhdWx0Qm9keURlc2NyaXB0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUlOT1JfVkVSU0lPTiA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFKT1JfVkVSU0lPTiA9IDE7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzTWltZVZlcnNpb25TZXQ7CisgICAgcHJpdmF0ZSBpbnQgbWltZU1pbm9yVmVyc2lvbjsKKyAgICBwcml2YXRlIGludCBtaW1lTWFqb3JWZXJzaW9uOworICAgIHByaXZhdGUgTWltZUV4Y2VwdGlvbiBtaW1lVmVyc2lvbkV4Y2VwdGlvbjsKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZW50SWQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29udGVudElkU2V0OworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnREZXNjcmlwdGlvbjsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb250ZW50RGVzY3JpcHRpb25TZXQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudERpc3Bvc2l0aW9uVHlwZTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gY29udGVudERpc3Bvc2l0aW9uUGFyYW1ldGVyczsKKyAgICBwcml2YXRlIERhdGVUaW1lIGNvbnRlbnREaXNwb3NpdGlvbk1vZGlmaWNhdGlvbkRhdGU7CisgICAgcHJpdmF0ZSBNaW1lRXhjZXB0aW9uIGNvbnRlbnREaXNwb3NpdGlvbk1vZGlmaWNhdGlvbkRhdGVQYXJzZUV4Y2VwdGlvbjsKKyAgICBwcml2YXRlIERhdGVUaW1lIGNvbnRlbnREaXNwb3NpdGlvbkNyZWF0aW9uRGF0ZTsKKyAgICBwcml2YXRlIE1pbWVFeGNlcHRpb24gY29udGVudERpc3Bvc2l0aW9uQ3JlYXRpb25EYXRlUGFyc2VFeGNlcHRpb247CisgICAgcHJpdmF0ZSBEYXRlVGltZSBjb250ZW50RGlzcG9zaXRpb25SZWFkRGF0ZTsKKyAgICBwcml2YXRlIE1pbWVFeGNlcHRpb24gY29udGVudERpc3Bvc2l0aW9uUmVhZERhdGVQYXJzZUV4Y2VwdGlvbjsKKyAgICBwcml2YXRlIGxvbmcgY29udGVudERpc3Bvc2l0aW9uU2l6ZTsKKyAgICBwcml2YXRlIE1pbWVFeGNlcHRpb24gY29udGVudERpc3Bvc2l0aW9uU2l6ZVBhcnNlRXhjZXB0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbnRlbnREaXNwb3NpdGlvblNldDsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBjb250ZW50TGFuZ3VhZ2U7CisgICAgcHJpdmF0ZSBNaW1lRXhjZXB0aW9uIGNvbnRlbnRMYW5ndWFnZVBhcnNlRXhjZXB0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbnRlbnRMYW5ndWFnZVNldDsKKyAgICBwcml2YXRlIE1pbWVFeGNlcHRpb24gY29udGVudExvY2F0aW9uUGFyc2VFeGNlcHRpb247CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGVudExvY2F0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbnRlbnRMb2NhdGlvblNldDsKKyAgICBwcml2YXRlIFN0cmluZyBjb250ZW50TUQ1UmF3OworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbnRlbnRNRDVTZXQ7CisgICAgCisgICAgcHJvdGVjdGVkIE1heGltYWxCb2R5RGVzY3JpcHRvcigpIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWF4aW1hbEJvZHlEZXNjcmlwdG9yKEJvZHlEZXNjcmlwdG9yIHBhcmVudCkgeworICAgICAgICBzdXBlcihwYXJlbnQpOworICAgICAgICBpc01pbWVWZXJzaW9uU2V0ID0gZmFsc2U7CisgICAgICAgIG1pbWVNYWpvclZlcnNpb24gPSBERUZBVUxUX01BSk9SX1ZFUlNJT047CisgICAgICAgIG1pbWVNaW5vclZlcnNpb24gPSBERUZBVUxUX01JTk9SX1ZFUlNJT047CisgICAgICAgIHRoaXMuY29udGVudElkID0gbnVsbDsKKyAgICAgICAgdGhpcy5pc0NvbnRlbnRJZFNldCA9IGZhbHNlOworICAgICAgICB0aGlzLmNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7CisgICAgICAgIHRoaXMuaXNDb250ZW50RGVzY3JpcHRpb25TZXQgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25UeXBlID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25Nb2RpZmljYXRpb25EYXRlID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25Nb2RpZmljYXRpb25EYXRlUGFyc2VFeGNlcHRpb24gPSBudWxsOworICAgICAgICB0aGlzLmNvbnRlbnREaXNwb3NpdGlvbkNyZWF0aW9uRGF0ZSA9IG51bGw7CisgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uQ3JlYXRpb25EYXRlUGFyc2VFeGNlcHRpb24gPSBudWxsOworICAgICAgICB0aGlzLmNvbnRlbnREaXNwb3NpdGlvblJlYWREYXRlID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25SZWFkRGF0ZVBhcnNlRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25TaXplID0gLTE7CisgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uU2l6ZVBhcnNlRXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdGhpcy5pc0NvbnRlbnREaXNwb3NpdGlvblNldCA9IGZhbHNlOworICAgICAgICB0aGlzLmNvbnRlbnRMYW5ndWFnZSA9IG51bGw7CisgICAgICAgIHRoaXMuY29udGVudExhbmd1YWdlUGFyc2VFeGNlcHRpb24gPSBudWxsOworICAgICAgICB0aGlzLmlzQ29udGVudElkU2V0ID0gZmFsc2U7CisgICAgICAgIHRoaXMuY29udGVudExvY2F0aW9uID0gbnVsbDsKKyAgICAgICAgdGhpcy5jb250ZW50TG9jYXRpb25QYXJzZUV4Y2VwdGlvbiA9IG51bGw7CisgICAgICAgIHRoaXMuaXNDb250ZW50TG9jYXRpb25TZXQgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5jb250ZW50TUQ1UmF3ID0gbnVsbDsKKyAgICAgICAgdGhpcy5pc0NvbnRlbnRNRDVTZXQgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkRmllbGQoRmllbGQgZmllbGQpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWVsZC5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpZWxkLmdldEJvZHkoKTsKKyAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGlmIChNaW1lVXRpbC5NSU1FX0hFQURFUl9NSU1FX1ZFUlNJT04uZXF1YWxzKG5hbWUpICYmICFpc01pbWVWZXJzaW9uU2V0KSB7CisgICAgICAgICAgICBwYXJzZU1pbWVWZXJzaW9uKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChNaW1lVXRpbC5NSU1FX0hFQURFUl9DT05URU5UX0lELmVxdWFscyhuYW1lKSAmJiAhaXNDb250ZW50SWRTZXQpIHsKKyAgICAgICAgICAgIHBhcnNlQ29udGVudElkKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChNaW1lVXRpbC5NSU1FX0hFQURFUl9DT05URU5UX0RFU0NSSVBUSU9OLmVxdWFscyhuYW1lKSAmJiAhaXNDb250ZW50RGVzY3JpcHRpb25TZXQpIHsKKyAgICAgICAgICAgIHBhcnNlQ29udGVudERlc2NyaXB0aW9uKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChNaW1lVXRpbC5NSU1FX0hFQURFUl9DT05URU5UX0RJU1BPU0lUSU9OLmVxdWFscyhuYW1lKSAmJiAhaXNDb250ZW50RGlzcG9zaXRpb25TZXQpIHsKKyAgICAgICAgICAgIHBhcnNlQ29udGVudERpc3Bvc2l0aW9uKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChNaW1lVXRpbC5NSU1FX0hFQURFUl9MQU5HQVVHRS5lcXVhbHMobmFtZSkgJiYgIWlzQ29udGVudExhbmd1YWdlU2V0KSB7CisgICAgICAgICAgICBwYXJzZUxhbmd1YWdlKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChNaW1lVXRpbC5NSU1FX0hFQURFUl9MT0NBVElPTi5lcXVhbHMobmFtZSkgJiYgIWlzQ29udGVudExvY2F0aW9uU2V0KSB7CisgICAgICAgICAgICBwYXJzZUxvY2F0aW9uKHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChNaW1lVXRpbC5NSU1FX0hFQURFUl9NRDUuZXF1YWxzKG5hbWUpICYmICFpc0NvbnRlbnRNRDVTZXQpIHsKKyAgICAgICAgICAgIHBhcnNlTUQ1KHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmFkZEZpZWxkKGZpZWxkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VNRDUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlzQ29udGVudE1ENVNldCA9IHRydWU7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZW50TUQ1UmF3ID0gdmFsdWUudHJpbSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlTG9jYXRpb24oZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlzQ29udGVudExvY2F0aW9uU2V0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1JlYWRlciBzdHJpbmdSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHZhbHVlKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cnVjdHVyZWRGaWVsZFBhcnNlciBwYXJzZXIgPSBuZXcgU3RydWN0dXJlZEZpZWxkUGFyc2VyKHN0cmluZ1JlYWRlcik7CisgICAgICAgICAgICBwYXJzZXIuc2V0Rm9sZGluZ1ByZXNlcnZlZChmYWxzZSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnRlbnRMb2NhdGlvbiA9IHBhcnNlci5wYXJzZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoTWltZUV4Y2VwdGlvbiBlKSB7IAorICAgICAgICAgICAgICAgIGNvbnRlbnRMb2NhdGlvblBhcnNlRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VMYW5ndWFnZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaXNDb250ZW50TGFuZ3VhZ2VTZXQgPSB0cnVlOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb250ZW50TGFuZ3VhZ2VQYXJzZXIgcGFyc2VyID0gbmV3IENvbnRlbnRMYW5ndWFnZVBhcnNlcihuZXcgU3RyaW5nUmVhZGVyKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgY29udGVudExhbmd1YWdlID0gcGFyc2VyLnBhcnNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChNaW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBjb250ZW50TGFuZ3VhZ2VQYXJzZUV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VDb250ZW50RGlzcG9zaXRpb24oZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlzQ29udGVudERpc3Bvc2l0aW9uU2V0ID0gdHJ1ZTsKKyAgICAgICAgY29udGVudERpc3Bvc2l0aW9uUGFyYW1ldGVycyA9IE1pbWVVdGlsLmdldEhlYWRlclBhcmFtcyh2YWx1ZSk7CisgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvblR5cGUgPSBjb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzLmdldCgiIik7CisgICAgICAgIAorICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudERpc3Bvc2l0aW9uTW9kaWZpY2F0aW9uRGF0ZSAKKyAgICAgICAgICAgID0gY29udGVudERpc3Bvc2l0aW9uUGFyYW1ldGVycy5nZXQoTWltZVV0aWwuUEFSQU1fTU9ESUZJQ0FUSU9OX0RBVEUpOworICAgICAgICBpZiAoY29udGVudERpc3Bvc2l0aW9uTW9kaWZpY2F0aW9uRGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uTW9kaWZpY2F0aW9uRGF0ZSA9IHBhcnNlRGF0ZShjb250ZW50RGlzcG9zaXRpb25Nb2RpZmljYXRpb25EYXRlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnREaXNwb3NpdGlvbk1vZGlmaWNhdGlvbkRhdGVQYXJzZUV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9IAorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudERpc3Bvc2l0aW9uQ3JlYXRpb25EYXRlIAorICAgICAgICAgICAgPSBjb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzLmdldChNaW1lVXRpbC5QQVJBTV9DUkVBVElPTl9EQVRFKTsKKyAgICAgICAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbkNyZWF0aW9uRGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uQ3JlYXRpb25EYXRlID0gcGFyc2VEYXRlKGNvbnRlbnREaXNwb3NpdGlvbkNyZWF0aW9uRGF0ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25DcmVhdGlvbkRhdGVQYXJzZUV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICB9ICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZW50RGlzcG9zaXRpb25SZWFkRGF0ZSAKKyAgICAgICAgICAgID0gY29udGVudERpc3Bvc2l0aW9uUGFyYW1ldGVycy5nZXQoTWltZVV0aWwuUEFSQU1fUkVBRF9EQVRFKTsKKyAgICAgICAgaWYgKGNvbnRlbnREaXNwb3NpdGlvblJlYWREYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25SZWFkRGF0ZSA9IHBhcnNlRGF0ZShjb250ZW50RGlzcG9zaXRpb25SZWFkRGF0ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50RGlzcG9zaXRpb25SZWFkRGF0ZVBhcnNlRXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgIH0gICAgICAgICAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmluYWwgU3RyaW5nIHNpemUgPSBjb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzLmdldChNaW1lVXRpbC5QQVJBTV9TSVpFKTsKKyAgICAgICAgaWYgKHNpemUgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb25TaXplID0gTG9uZy5wYXJzZUxvbmcoc2l6ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uU2l6ZVBhcnNlRXhjZXB0aW9uID0gKE1pbWVFeGNlcHRpb24pIG5ldyBNaW1lRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKS5maWxsSW5TdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29udGVudERpc3Bvc2l0aW9uUGFyYW1ldGVycy5yZW1vdmUoIiIpOworICAgIH0KKworICAgIHByaXZhdGUgRGF0ZVRpbWUgcGFyc2VEYXRlKGZpbmFsIFN0cmluZyBkYXRlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihkYXRlKTsKKyAgICAgICAgZmluYWwgRGF0ZVRpbWVQYXJzZXIgcGFyc2VyID0gbmV3IERhdGVUaW1lUGFyc2VyKHN0cmluZ1JlYWRlcik7CisgICAgICAgIERhdGVUaW1lIHJlc3VsdCA9IHBhcnNlci5kYXRlX3RpbWUoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQ29udGVudERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgY29udGVudERlc2NyaXB0aW9uID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZW50RGVzY3JpcHRpb24gPSB2YWx1ZS50cmltKCk7CisgICAgICAgIH0KKyAgICAgICAgaXNDb250ZW50RGVzY3JpcHRpb25TZXQgPSB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZUNvbnRlbnRJZChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRlbnRJZCA9ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudElkID0gdmFsdWUudHJpbSgpOworICAgICAgICB9CisgICAgICAgIGlzQ29udGVudElkU2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2VNaW1lVmVyc2lvbihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIodmFsdWUpOworICAgICAgICBmaW5hbCBNaW1lVmVyc2lvblBhcnNlciBwYXJzZXIgPSBuZXcgTWltZVZlcnNpb25QYXJzZXIocmVhZGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZSgpOworICAgICAgICAgICAgZmluYWwgaW50IG1ham9yID0gcGFyc2VyLmdldE1ham9yVmVyc2lvbigpOworICAgICAgICAgICAgaWYgKG1ham9yICE9IE1pbWVWZXJzaW9uUGFyc2VyLklOSVRJQUxfVkVSU0lPTl9WQUxVRSkgeworICAgICAgICAgICAgICAgIG1pbWVNYWpvclZlcnNpb24gPSBtYWpvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGludCBtaW5vciA9IHBhcnNlci5nZXRNaW5vclZlcnNpb24oKTsKKyAgICAgICAgICAgIGlmIChtaW5vciAhPSBNaW1lVmVyc2lvblBhcnNlci5JTklUSUFMX1ZFUlNJT05fVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBtaW1lTWlub3JWZXJzaW9uID0gbWlub3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE1pbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhpcy5taW1lVmVyc2lvbkV4Y2VwdGlvbiA9IGU7CisgICAgICAgIH0KKyAgICAgICAgaXNNaW1lVmVyc2lvblNldCA9IHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIE1JTUUgbWFqb3IgdmVyc2lvbgorICAgICAqIGFzIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+TUlNRS1WZXJzaW9uPC9jb2RlPgorICAgICAqIGhlYWRlci4KKyAgICAgKiBEZWZhdWx0cyB0byBvbmUuCisgICAgICogQHJldHVybiBwb3NpdGl2ZSBpbnRlZ2VyCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNaW1lTWFqb3JWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gbWltZU1ham9yVmVyc2lvbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgTUlNRSBtaW5vciB2ZXJzaW9uCisgICAgICogYXMgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT5NSU1FLVZlcnNpb248L2NvZGU+CisgICAgICogaGVhZGVyLiAKKyAgICAgKiBEZWZhdWx0cyB0byB6ZXJvLgorICAgICAqIEByZXR1cm4gcG9zaXRpdmUgaW50ZWdlcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWltZU1pbm9yVmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIG1pbWVNaW5vclZlcnNpb247CisgICAgfQorICAgIAorCisgICAgLyoqCisgICAgICogV2hlbiB0aGUgTUlNRSB2ZXJzaW9uIGhlYWRlciBleGlzdHMgYnV0IGNhbm5vdCBiZSBwYXJzZWQKKyAgICAgKiB0aGlzIGZpZWxkIHdpbGwgYmUgY29udGFpbiB0aGUgZXhjZXB0aW9uLgorICAgICAqIEByZXR1cm4gPGNvZGU+TWltZUV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlIG1pbWUgaGVhZGVyIGNhbm5vdAorICAgICAqIGJlIHBhcnNlZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTWltZUV4Y2VwdGlvbiBnZXRNaW1lVmVyc2lvblBhcnNlRXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbWltZVZlcnNpb25FeGNlcHRpb247CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSA8YSBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjA0NSc+UkZDPC9hPiAKKyAgICAgKiA8Y29kZT5Db250ZW50LURlc2NyaXB0aW9uPC9jb2RlPiBoZWFkZXIuCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgPGNvZGU+Q29udGVudC1EZXNjcmlwdGlvbjwvY29kZT4gd2hlbiBwcmVzZW50LAorICAgICAqIG51bGwgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBjb250ZW50RGVzY3JpcHRpb247CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSA8YSBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjA0NSc+UkZDPC9hPiAKKyAgICAgKiA8Y29kZT5Db250ZW50LUlEPC9jb2RlPiBoZWFkZXIuCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgPGNvZGU+Q29udGVudC1JRDwvY29kZT4gd2hlbiBwcmVzZW50LAorICAgICAqIG51bGwgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50SWQoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50SWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRpc3Bvc2l0aW9uIHR5cGUgb2YgdGhlIDxjb2RlPmNvbnRlbnQtZGlzcG9zaXRpb248L2NvZGU+IGZpZWxkLgorICAgICAqIFRoZSB2YWx1ZSBpcyBjYXNlIGluc2Vuc2l0aXZlIGFuZCB3aWxsIGJlIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgorICAgICAqIFNlZSA8YSBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjE4My5odG1sJz5SRkMyMTgzPC9hPi4KKyAgICAgKiBAcmV0dXJuIGNvbnRlbnQgZGlzcG9zaXRpb24gdHlwZSwgCisgICAgICogb3IgbnVsbCB3aGVuIHRoaXMgaGFzIG5vdCBiZWVuIHNldAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudERpc3Bvc2l0aW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnREaXNwb3NpdGlvblR5cGU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIDxjb2RlPmNvbnRlbnQtZGlzcG9zaXRpb248L2NvZGU+IGZpZWxkLgorICAgICAqIFNlZSA8YSBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjE4My5odG1sJz5SRkMyMTgzPC9hPi4KKyAgICAgKiBAcmV0dXJuIHBhcmFtZXRlciB2YWx1ZSBzdHJpbmdzIGluZGV4ZWQgYnkgcGFyYW1ldGVyIG5hbWUgc3RyaW5ncywKKyAgICAgKiBub3QgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldENvbnRlbnREaXNwb3NpdGlvblBhcmFtZXRlcnMoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSA8Y29kZT5maWxlbmFtZTwvY29kZT4gcGFyYW1ldGVyIHZhbHVlIG9mIHRoZSA8Y29kZT5jb250ZW50LWRpc3Bvc2l0aW9uPC9jb2RlPiBmaWVsZC4KKyAgICAgKiBTZWUgPGEgaHJlZj0naHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzIxODMuaHRtbCc+UkZDMjE4MzwvYT4uCisgICAgICogQHJldHVybiBmaWxlbmFtZSBwYXJhbWV0ZXIgdmFsdWUsIAorICAgICAqIG9yIG51bGwgd2hlbiBpdCBpcyBub3QgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzLmdldChNaW1lVXRpbC5QQVJBTV9GSUxFTkFNRSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPm1vZGlmaWNhdGlvbi1kYXRlPC9jb2RlPiBwYXJhbWV0ZXIgdmFsdWUgb2YgdGhlIDxjb2RlPmNvbnRlbnQtZGlzcG9zaXRpb248L2NvZGU+IGZpZWxkLgorICAgICAqIFNlZSA8YSBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjE4My5odG1sJz5SRkMyMTgzPC9hPi4KKyAgICAgKiBAcmV0dXJuIG1vZGlmaWNhdGlvbi1kYXRlIHBhcmFtZXRlciB2YWx1ZSwKKyAgICAgKiBvciBudWxsIHdoZW4gdGhpcyBpcyBub3QgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBEYXRlVGltZSBnZXRDb250ZW50RGlzcG9zaXRpb25Nb2RpZmljYXRpb25EYXRlKCkgeworICAgICAgICByZXR1cm4gY29udGVudERpc3Bvc2l0aW9uTW9kaWZpY2F0aW9uRGF0ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyBhbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcgdGhlIHBhcnNpbmcgb2Yge0BsaW5rICNnZXRDb250ZW50RGlzcG9zaXRpb25Nb2RpZmljYXRpb25EYXRlKCl9CisgICAgICogQHJldHVybiA8Y29kZT5QYXJzZUV4Y2VwdGlvbjwvY29kZT4gd2hlbiB0aGUgbW9kaWZpY2F0aW9uLWRhdGUgcGFyc2UgZmFpbHMsCisgICAgICogbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTWltZUV4Y2VwdGlvbiBnZXRDb250ZW50RGlzcG9zaXRpb25Nb2RpZmljYXRpb25EYXRlUGFyc2VFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBjb250ZW50RGlzcG9zaXRpb25Nb2RpZmljYXRpb25EYXRlUGFyc2VFeGNlcHRpb247CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPmNyZWF0aW9uLWRhdGU8L2NvZGU+IHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgPGNvZGU+Y29udGVudC1kaXNwb3NpdGlvbjwvY29kZT4gZmllbGQuCisgICAgICogU2VlIDxhIGhyZWY9J2h0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMyMTgzLmh0bWwnPlJGQzIxODM8L2E+LgorICAgICAqIEByZXR1cm4gY3JlYXRpb24tZGF0ZSBwYXJhbWV0ZXIgdmFsdWUsCisgICAgICogb3IgbnVsbCB3aGVuIHRoaXMgaXMgbm90IHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZVRpbWUgZ2V0Q29udGVudERpc3Bvc2l0aW9uQ3JlYXRpb25EYXRlKCkgeworICAgICAgICByZXR1cm4gY29udGVudERpc3Bvc2l0aW9uQ3JlYXRpb25EYXRlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIGFueSBleGNlcHRpb24gdGhyb3duIGR1cmluZyB0aGUgcGFyc2luZyBvZiB7QGxpbmsgI2dldENvbnRlbnREaXNwb3NpdGlvbkNyZWF0aW9uRGF0ZSgpfQorICAgICAqIEByZXR1cm4gPGNvZGU+UGFyc2VFeGNlcHRpb248L2NvZGU+IHdoZW4gdGhlIGNyZWF0aW9uLWRhdGUgcGFyc2UgZmFpbHMsCisgICAgICogbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgTWltZUV4Y2VwdGlvbiBnZXRDb250ZW50RGlzcG9zaXRpb25DcmVhdGlvbkRhdGVQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnREaXNwb3NpdGlvbkNyZWF0aW9uRGF0ZVBhcnNlRXhjZXB0aW9uOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSA8Y29kZT5yZWFkLWRhdGU8L2NvZGU+IHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgPGNvZGU+Y29udGVudC1kaXNwb3NpdGlvbjwvY29kZT4gZmllbGQuCisgICAgICogU2VlIDxhIGhyZWY9J2h0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMyMTgzLmh0bWwnPlJGQzIxODM8L2E+LgorICAgICAqIEByZXR1cm4gcmVhZC1kYXRlIHBhcmFtZXRlciB2YWx1ZSwKKyAgICAgKiBvciBudWxsIHdoZW4gdGhpcyBpcyBub3QgcHJlc2VudAorICAgICAqLworICAgIHB1YmxpYyBEYXRlVGltZSBnZXRDb250ZW50RGlzcG9zaXRpb25SZWFkRGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnREaXNwb3NpdGlvblJlYWREYXRlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIGFueSBleGNlcHRpb24gdGhyb3duIGR1cmluZyB0aGUgcGFyc2luZyBvZiB7QGxpbmsgI2dldENvbnRlbnREaXNwb3NpdGlvblJlYWREYXRlKCl9CisgICAgICogQHJldHVybiA8Y29kZT5QYXJzZUV4Y2VwdGlvbjwvY29kZT4gd2hlbiB0aGUgcmVhZC1kYXRlIHBhcnNlIGZhaWxzLAorICAgICAqIG51bGwgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIE1pbWVFeGNlcHRpb24gZ2V0Q29udGVudERpc3Bvc2l0aW9uUmVhZERhdGVQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnREaXNwb3NpdGlvblJlYWREYXRlUGFyc2VFeGNlcHRpb247CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIDxjb2RlPnNpemU8L2NvZGU+IHBhcmFtZXRlciB2YWx1ZSBvZiB0aGUgPGNvZGU+Y29udGVudC1kaXNwb3NpdGlvbjwvY29kZT4gZmllbGQuCisgICAgICogU2VlIDxhIGhyZWY9J2h0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMyMTgzLmh0bWwnPlJGQzIxODM8L2E+LgorICAgICAqIEByZXR1cm4gc2l6ZSBwYXJhbWV0ZXIgdmFsdWUsCisgICAgICogb3IgLTEgaWYgdGhpcyBzaXplIGhhcyBub3QgYmVlbiBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50RGlzcG9zaXRpb25TaXplKCkgeworICAgICAgICByZXR1cm4gY29udGVudERpc3Bvc2l0aW9uU2l6ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyBhbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcgdGhlIHBhcnNpbmcgb2Yge0BsaW5rICNnZXRDb250ZW50RGlzcG9zaXRpb25TaXplKCl9CisgICAgICogQHJldHVybiA8Y29kZT5QYXJzZUV4Y2VwdGlvbjwvY29kZT4gd2hlbiB0aGUgcmVhZC1kYXRlIHBhcnNlIGZhaWxzLAorICAgICAqIG51bGwgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIE1pbWVFeGNlcHRpb24gZ2V0Q29udGVudERpc3Bvc2l0aW9uU2l6ZVBhcnNlRXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gY29udGVudERpc3Bvc2l0aW9uU2l6ZVBhcnNlRXhjZXB0aW9uOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIDxjb2RlPmNvbnRlbnQtbGFuZ3VhZ2U8L2NvZGU+IGhlYWRlciB2YWx1ZXMuCisgICAgICogRWFjaCBhcHBsaWNhYmxlIGxhbmd1YWdlIHRhZyB3aWxsIGJlIHJldHVybmVkIGluIG9yZGVyLgorICAgICAqIFNlZSA8YSBocmVmPSdodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ2Jz5SRkM0NjQ2PC9hPiAKKyAgICAgKiA8Y2l0ZT5odHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ2PC9jaXRlPi4KKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgbGFuZ3VhZ2UgdGFnIFN0cmluZ3MsCisgICAgICogb3IgbnVsbCBpZiBubyBoZWFkZXIgZXhpc3RzCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDb250ZW50TGFuZ3VhZ2UoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50TGFuZ3VhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcgdGhlIHBhcnNpbmcgb2Yge0BsaW5rICNnZXRDb250ZW50TGFuZ3VhZ2UoKX0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPlBhcnNlRXhjZXB0aW9uPC9jb2RlPiB3aGVuIHRoZSBjb250ZW50LWxhbmd1YWdlIHBhcnNlIGZhaWxzLAorICAgICAqIG51bGwgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIE1pbWVFeGNlcHRpb24gZ2V0Q29udGVudExhbmd1YWdlUGFyc2VFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBjb250ZW50TGFuZ3VhZ2VQYXJzZUV4Y2VwdGlvbjsKKyAgICB9CisgICAgCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIDxjb2RlPmNvbnRlbnQtbG9jYXRpb248L2NvZGU+IGhlYWRlciB2YWx1ZS4KKyAgICAgKiBTZWUgPGEgaHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjU1Nyc+UkZDMjU1NzwvYT4gCisgICAgICogQHJldHVybiB0aGUgVVJMIGNvbnRlbnQtbG9jYXRpb24KKyAgICAgKiBvciBudWxsIGlmIG5vIGhlYWRlciBleGlzdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRMb2NhdGlvbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyBhbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcgdGhlIHBhcnNpbmcgb2Yge0BsaW5rICNnZXRDb250ZW50TG9jYXRpb24oKX0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPlBhcnNlRXhjZXB0aW9uPC9jb2RlPiB3aGVuIHRoZSBjb250ZW50LWxhbmd1YWdlIHBhcnNlIGZhaWxzLAorICAgICAqIG51bGwgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIE1pbWVFeGNlcHRpb24gZ2V0Q29udGVudExvY2F0aW9uUGFyc2VFeGNlcHRpb24oKSB7CisgICAgICAgIHJldHVybiBjb250ZW50TG9jYXRpb25QYXJzZUV4Y2VwdGlvbjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcmF3LCBCYXNlNjQgZW5jb2RlZCB2YWx1ZSBvZiB0aGUKKyAgICAgKiA8Y29kZT5Db250ZW50LU1ENTwvY29kZT4gZmllbGQuCisgICAgICogU2VlIDxhIGhyZWY9J2h0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE4NjQnPlJGQzE4NjQ8L2E+LgorICAgICAqIEByZXR1cm4gcmF3IGVuY29kZWQgY29udGVudC1tZDUKKyAgICAgKiBvciBudWxsIGlmIG5vIGhlYWRlciBleGlzdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRNRDVSYXcoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50TUQ1UmF3OworICAgIH0KKyAgICAKKyAgICAKK30gCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvTXV0YWJsZUJvZHlEZXNjcmlwdG9yLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvTXV0YWJsZUJvZHlEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4OTk2MwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9NdXRhYmxlQm9keURlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5GaWVsZDsKKworLyoqCisgKiBBZGRzIG11dGF0b3IuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIGV4dGVuZHMgQm9keURlc2NyaXB0b3IgeworCisgICAgLyoqCisgICAgICogQWRkcyBhIGZpZWxkIHRvIHRoZSBib2R5IGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIGZpZWxkIHRoZSBNSU1FIGZpZWxkLgorICAgICAqLworICAgIHZvaWQgYWRkRmllbGQoRmllbGQgZmllbGQpOworCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0Fic3RyYWN0RmllbGQuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvQWJzdHJhY3RGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5N2MxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0Fic3RyYWN0RmllbGQuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZDsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkJ5dGVTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNvbnRlbnRVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuTWltZVV0aWw7CisKKy8qKgorICogVGhlIGJhc2UgY2xhc3Mgb2YgYWxsIGZpZWxkIGNsYXNzZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpZWxkIGltcGxlbWVudHMgUGFyc2VkRmllbGQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGSUVMRF9OQU1FX1BBVFRFUk4gPSBQYXR0ZXJuCisgICAgICAgICAgICAuY29tcGlsZSgiXihbXFx4MjEtXFx4MzlcXHgzYi1cXHg3ZV0rKToiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRGaWVsZFBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdEZpZWxkUGFyc2VyKCk7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBib2R5OworICAgIHByaXZhdGUgZmluYWwgQnl0ZVNlcXVlbmNlIHJhdzsKKyAgICAKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWVsZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGJvZHksIGZpbmFsIEJ5dGVTZXF1ZW5jZSByYXcpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICAgICAgdGhpcy5yYXcgPSByYXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZQorICAgICAqIDxjb2RlPkZpZWxkPC9jb2RlPiBjbGFzcy4gVGhlIHR5cGUgb2YgdGhlIGNsYXNzIHJldHVybmVkIGRlcGVuZHMgb24gdGhlCisgICAgICogZmllbGQgbmFtZTsgc2VlIHtAbGluayAjcGFyc2UoU3RyaW5nKX0gZm9yIGEgdGFibGUgb2YgZmllbGQgbmFtZXMgYW5kCisgICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjbGFzc2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSByYXcgdGhlIGJ5dGVzIHRvIHBhcnNlLgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5QYXJzZWRGaWVsZDwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBNaW1lRXhjZXB0aW9uIGlmIHRoZSByYXcgc3RyaW5nIGNhbm5vdCBiZSBzcGxpdCBpbnRvIGZpZWxkIG5hbWUgYW5kIGJvZHkuCisgICAgICogQHNlZSAjaXNWYWxpZEZpZWxkKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcnNlZEZpZWxkIHBhcnNlKGZpbmFsIEJ5dGVTZXF1ZW5jZSByYXcpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJhd1N0ciA9IENvbnRlbnRVdGlsLmRlY29kZShyYXcpOworICAgICAgICByZXR1cm4gcGFyc2UocmF3LCByYXdTdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSAKKyAgICAgKiA8Y29kZT5GaWVsZDwvY29kZT4gY2xhc3MuIFRoZSB0eXBlIG9mIHRoZSBjbGFzcyByZXR1cm5lZCBkZXBlbmRzIG9uCisgICAgICogdGhlIGZpZWxkIG5hbWU6CisgICAgICogPHA+CisgICAgICogPHRhYmxlPgorICAgICAqICAgPHRyPjx0aD5DbGFzcyByZXR1cm5lZDwvdGg+PHRoPkZpZWxkIG5hbWVzPC90aD48L3RyPgorICAgICAqICAgPHRyPjx0ZD57QGxpbmsgQ29udGVudFR5cGVGaWVsZH08L3RkPjx0ZD5Db250ZW50LVR5cGU8L3RkPjwvdHI+CisgICAgICogICA8dHI+PHRkPntAbGluayBDb250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkfTwvdGQ+PHRkPkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc8L3RkPjwvdHI+CisgICAgICogICA8dHI+PHRkPntAbGluayBDb250ZW50RGlzcG9zaXRpb25GaWVsZH08L3RkPjx0ZD5Db250ZW50LURpc3Bvc2l0aW9uPC90ZD48L3RyPgorICAgICAqICAgPHRyPjx0ZD57QGxpbmsgRGF0ZVRpbWVGaWVsZH08L3RkPjx0ZD5EYXRlLCBSZXNlbnQtRGF0ZTwvdGQ+PC90cj4KKyAgICAgKiAgIDx0cj48dGQ+e0BsaW5rIE1haWxib3hGaWVsZH08L3RkPjx0ZD5TZW5kZXIsIFJlc2VudC1TZW5kZXI8L3RkPjwvdHI+CisgICAgICogICA8dHI+PHRkPntAbGluayBNYWlsYm94TGlzdEZpZWxkfTwvdGQ+PHRkPkZyb20sIFJlc2VudC1Gcm9tPC90ZD48L3RyPgorICAgICAqICAgPHRyPjx0ZD57QGxpbmsgQWRkcmVzc0xpc3RGaWVsZH08L3RkPjx0ZD5UbywgQ2MsIEJjYywgUmVwbHktVG8sIFJlc2VudC1UbywgUmVzZW50LUNjLCBSZXNlbnQtQmNjPC90ZD48L3RyPgorICAgICAqICAgPHRyPjx0ZD57QGxpbmsgVW5zdHJ1Y3R1cmVkRmllbGR9PC90ZD48dGQ+U3ViamVjdCBhbmQgb3RoZXJzPC90ZD48L3RyPgorICAgICAqIDwvdGFibGU+CisgICAgICogCisgICAgICogQHBhcmFtIHJhd1N0ciB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICAgICAqIEByZXR1cm4gYSA8Y29kZT5QYXJzZWRGaWVsZDwvY29kZT4gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBNaW1lRXhjZXB0aW9uIGlmIHRoZSByYXcgc3RyaW5nIGNhbm5vdCBiZSBzcGxpdCBpbnRvIGZpZWxkIG5hbWUgYW5kIGJvZHkuCisgICAgICogQHNlZSAjaXNWYWxpZEZpZWxkKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhcnNlZEZpZWxkIHBhcnNlKGZpbmFsIFN0cmluZyByYXdTdHIpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZVNlcXVlbmNlIHJhdyA9IENvbnRlbnRVdGlsLmVuY29kZShyYXdTdHIpOworICAgICAgICByZXR1cm4gcGFyc2UocmF3LCByYXdTdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQgcGFyc2VyIHVzZWQgdG8gcGFyc2UgZmllbGRzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgZmllbGQgcGFyc2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEZWZhdWx0RmllbGRQYXJzZXIgZ2V0UGFyc2VyKCkgeworICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCAoPGNvZGU+U3ViamVjdDwvY29kZT4sIAorICAgICAqIDxjb2RlPkZyb208L2NvZGU+LCBldGMpLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgb3JpZ2luYWwgcmF3IGZpZWxkIHN0cmluZy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCByYXcgZmllbGQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlU2VxdWVuY2UgZ2V0UmF3KCkgeworICAgICAgICByZXR1cm4gcmF3OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1bmZvbGRlZCwgdW5wYXJzZWQgYW5kIHBvc3NpYmx5IGVuY29kZWQgKHNlZSBSRkMgMjA0NykgZmllbGQgCisgICAgICogYm9keSBzdHJpbmcuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdW5mb2xkZWQgdW5wYXJzZWQgZmllbGQgYm9keSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCb2R5KCkgeworICAgICAgICByZXR1cm4gYm9keTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFBhcnNlZEZpZWxkI2lzVmFsaWRGaWVsZCgpIAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhcnNlRXhjZXB0aW9uKCkgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFBhcnNlZEZpZWxkI2dldFBhcnNlRXhjZXB0aW9uKCkgCisgICAgICovCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdldFBhcnNlRXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmFtZSArICI6ICIgKyBib2R5OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFBhcnNlZEZpZWxkIHBhcnNlKGZpbmFsIEJ5dGVTZXF1ZW5jZSByYXcsIGZpbmFsIFN0cmluZyByYXdTdHIpCisgICAgICAgICAgICB0aHJvd3MgTWltZUV4Y2VwdGlvbiB7CisgICAgICAgIC8qCisgICAgICAgICAqIFVuZm9sZCB0aGUgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBTdHJpbmcgdW5mb2xkZWQgPSBNaW1lVXRpbC51bmZvbGQocmF3U3RyKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTcGxpdCBpbnRvIG5hbWUgYW5kIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgTWF0Y2hlciBmaWVsZE1hdGNoZXIgPSBGSUVMRF9OQU1FX1BBVFRFUk4ubWF0Y2hlcih1bmZvbGRlZCk7CisgICAgICAgIGlmICghZmllbGRNYXRjaGVyLmZpbmQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1pbWVFeGNlcHRpb24oIkludmFsaWQgZmllbGQgaW4gc3RyaW5nIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBmaWVsZE1hdGNoZXIuZ3JvdXAoMSk7CisKKyAgICAgICAgU3RyaW5nIGJvZHkgPSB1bmZvbGRlZC5zdWJzdHJpbmcoZmllbGRNYXRjaGVyLmVuZCgpKTsKKyAgICAgICAgaWYgKGJvZHkubGVuZ3RoKCkgPiAwICYmIGJvZHkuY2hhckF0KDApID09ICcgJykgeworICAgICAgICAgICAgYm9keSA9IGJvZHkuc3Vic3RyaW5nKDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZShuYW1lLCBib2R5LCByYXcpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9BZGRyZXNzTGlzdEZpZWxkLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0FkZHJlc3NMaXN0RmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTg0ZWJiCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9BZGRyZXNzTGlzdEZpZWxkLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5BZGRyZXNzTGlzdDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuUGFyc2VFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOw0KKw0KKy8qKg0KKyAqIEFkZHJlc3MgbGlzdCBmaWVsZCBzdWNoIGFzIDxjb2RlPlRvPC9jb2RlPiBvciA8Y29kZT5SZXBseS1UbzwvY29kZT4uDQorICovDQorcHVibGljIGNsYXNzIEFkZHJlc3NMaXN0RmllbGQgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEFkZHJlc3NMaXN0RmllbGQuY2xhc3MpOw0KKw0KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2VkID0gZmFsc2U7DQorDQorICAgIHByaXZhdGUgQWRkcmVzc0xpc3QgYWRkcmVzc0xpc3Q7DQorICAgIHByaXZhdGUgUGFyc2VFeGNlcHRpb24gcGFyc2VFeGNlcHRpb247DQorDQorICAgIEFkZHJlc3NMaXN0RmllbGQoU3RyaW5nIG5hbWUsIFN0cmluZyBib2R5LCBCeXRlU2VxdWVuY2UgcmF3KSB7DQorICAgICAgICBzdXBlcihuYW1lLCBib2R5LCByYXcpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBBZGRyZXNzTGlzdCBnZXRBZGRyZXNzTGlzdCgpIHsNCisgICAgICAgIGlmICghcGFyc2VkKQ0KKyAgICAgICAgICAgIHBhcnNlKCk7DQorDQorICAgICAgICByZXR1cm4gYWRkcmVzc0xpc3Q7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBnZXRQYXJzZUV4Y2VwdGlvbigpIHsNCisgICAgICAgIGlmICghcGFyc2VkKQ0KKyAgICAgICAgICAgIHBhcnNlKCk7DQorDQorICAgICAgICByZXR1cm4gcGFyc2VFeGNlcHRpb247DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkgew0KKyAgICAgICAgU3RyaW5nIGJvZHkgPSBnZXRCb2R5KCk7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGFkZHJlc3NMaXN0ID0gQWRkcmVzc0xpc3QucGFyc2UoYm9keSk7DQorICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyc2luZyB2YWx1ZSAnIiArIGJvZHkgKyAiJzogIiArIGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24gPSBlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcGFyc2VkID0gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgICBzdGF0aWMgZmluYWwgRmllbGRQYXJzZXIgUEFSU0VSID0gbmV3IEZpZWxkUGFyc2VyKCkgew0KKyAgICAgICAgcHVibGljIFBhcnNlZEZpZWxkIHBhcnNlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgYm9keSwNCisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVNlcXVlbmNlIHJhdykgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQWRkcmVzc0xpc3RGaWVsZChuYW1lLCBib2R5LCByYXcpOw0KKyAgICAgICAgfQ0KKyAgICB9Ow0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0NvbnRlbnREaXNwb3NpdGlvbkZpZWxkLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0NvbnRlbnREaXNwb3NpdGlvbkZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE5N2MzNgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvQ29udGVudERpc3Bvc2l0aW9uRmllbGQuamF2YQpAQCAtMCwwICsxLDMyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7DQorDQoraW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5EYXRlOw0KK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuY29udGVudGRpc3Bvc2l0aW9uLnBhcnNlci5Db250ZW50RGlzcG9zaXRpb25QYXJzZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmNvbnRlbnRkaXNwb3NpdGlvbi5wYXJzZXIuVG9rZW5NZ3JFcnJvcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuZGF0ZXRpbWUucGFyc2VyLkRhdGVUaW1lUGFyc2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkJ5dGVTZXF1ZW5jZTsNCisNCisvKioNCisgKiBSZXByZXNlbnRzIGEgPGNvZGU+Q29udGVudC1EaXNwb3NpdGlvbjwvY29kZT4gZmllbGQuDQorICovDQorcHVibGljIGNsYXNzIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7DQorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb250ZW50RGlzcG9zaXRpb25GaWVsZC5jbGFzcyk7DQorDQorICAgIC8qKiBUaGUgPGNvZGU+aW5saW5lPC9jb2RlPiBkaXNwb3NpdGlvbiB0eXBlLiAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNQT1NJVElPTl9UWVBFX0lOTElORSA9ICJpbmxpbmUiOw0KKw0KKyAgICAvKiogVGhlIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+IGRpc3Bvc2l0aW9uIHR5cGUuICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU1BPU0lUSU9OX1RZUEVfQVRUQUNITUVOVCA9ICJhdHRhY2htZW50IjsNCisNCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5maWxlbmFtZTwvY29kZT4gcGFyYW1ldGVyLiAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9GSUxFTkFNRSA9ICJmaWxlbmFtZSI7DQorDQorICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgPGNvZGU+Y3JlYXRpb24tZGF0ZTwvY29kZT4gcGFyYW1ldGVyLiAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DUkVBVElPTl9EQVRFID0gImNyZWF0aW9uLWRhdGUiOw0KKw0KKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIDxjb2RlPm1vZGlmaWNhdGlvbi1kYXRlPC9jb2RlPiBwYXJhbWV0ZXIuICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX01PRElGSUNBVElPTl9EQVRFID0gIm1vZGlmaWNhdGlvbi1kYXRlIjsNCisNCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5yZWFkLWRhdGU8L2NvZGU+IHBhcmFtZXRlci4gKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUkVBRF9EQVRFID0gInJlYWQtZGF0ZSI7DQorDQorICAgIC8qKiBUaGUgbmFtZSBvZiB0aGUgPGNvZGU+c2l6ZTwvY29kZT4gcGFyYW1ldGVyLiAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TSVpFID0gInNpemUiOw0KKw0KKyAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2VkID0gZmFsc2U7DQorDQorICAgIHByaXZhdGUgU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZSA9ICIiOw0KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KKyAgICBwcml2YXRlIFBhcnNlRXhjZXB0aW9uIHBhcnNlRXhjZXB0aW9uOw0KKw0KKyAgICBwcml2YXRlIGJvb2xlYW4gY3JlYXRpb25EYXRlUGFyc2VkOw0KKyAgICBwcml2YXRlIERhdGUgY3JlYXRpb25EYXRlOw0KKw0KKyAgICBwcml2YXRlIGJvb2xlYW4gbW9kaWZpY2F0aW9uRGF0ZVBhcnNlZDsNCisgICAgcHJpdmF0ZSBEYXRlIG1vZGlmaWNhdGlvbkRhdGU7DQorDQorICAgIHByaXZhdGUgYm9vbGVhbiByZWFkRGF0ZVBhcnNlZDsNCisgICAgcHJpdmF0ZSBEYXRlIHJlYWREYXRlOw0KKw0KKyAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZChTdHJpbmcgbmFtZSwgU3RyaW5nIGJvZHksIEJ5dGVTZXF1ZW5jZSByYXcpIHsNCisgICAgICAgIHN1cGVyKG5hbWUsIGJvZHksIHJhdyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyByYWlzZWQgZHVyaW5nIHBhcnNpbmcgb2YgdGhlIGZpZWxkIHZhbHVlLCBpZg0KKyAgICAgKiBhbnk7IG90aGVyd2lzZSwgbnVsbC4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2V0UGFyc2VFeGNlcHRpb24oKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIHBhcnNlRXhjZXB0aW9uOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSBkaXNwb3NpdGlvbiB0eXBlIGRlZmluZWQgaW4gdGhpcyBDb250ZW50LURpc3Bvc2l0aW9uIGZpZWxkLg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgZGlzcG9zaXRpb24gdHlwZSBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm90IHNldC4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcG9zaXRpb25UeXBlKCkgew0KKyAgICAgICAgaWYgKCFwYXJzZWQpDQorICAgICAgICAgICAgcGFyc2UoKTsNCisNCisgICAgICAgIHJldHVybiBkaXNwb3NpdGlvblR5cGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLiBQYXJhbWV0ZXIgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gbmFtZQ0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gZ2V0Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldC4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldHMgYWxsIHBhcmFtZXRlcnMuDQorICAgICAqIA0KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXJzLg0KKyAgICAgKi8NCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycygpIHsNCisgICAgICAgIGlmICghcGFyc2VkKQ0KKyAgICAgICAgICAgIHBhcnNlKCk7DQorDQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHBhcmFtZXRlcnMpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBkaXNwb3NpdGlvbiB0eXBlIG9mIHRoaXMgZmllbGQgbWF0Y2hlcyB0aGUgZ2l2ZW4gb25lLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGRpc3Bvc2l0aW9uVHlwZQ0KKyAgICAgKiAgICAgICAgICAgIHRoZSBkaXNwb3NpdGlvbiB0eXBlIHRvIG1hdGNoIGFnYWluc3QuDQorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRpc3Bvc2l0aW9uIHR5cGUgb2YgdGhpcyBmaWVsZA0KKyAgICAgKiAgICAgICAgIG1hdGNoZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2l0aW9uVHlwZShTdHJpbmcgZGlzcG9zaXRpb25UeXBlKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIHRoaXMuZGlzcG9zaXRpb25UeXBlLmVxdWFsc0lnbm9yZUNhc2UoZGlzcG9zaXRpb25UeXBlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkaXNwb3NpdGlvbiB0eXBlIG9mIHRoaXMgZmllbGQgaXMNCisgICAgICogPGk+aW5saW5lPC9pPiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRpc3Bvc2l0aW9uIHR5cGUgb2YgdGhpcyBmaWVsZCBpcw0KKyAgICAgKiAgICAgICAgIDxpPmlubGluZTwvaT4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0lubGluZSgpIHsNCisgICAgICAgIGlmICghcGFyc2VkKQ0KKyAgICAgICAgICAgIHBhcnNlKCk7DQorDQorICAgICAgICByZXR1cm4gZGlzcG9zaXRpb25UeXBlLmVxdWFscyhESVNQT1NJVElPTl9UWVBFX0lOTElORSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlzcG9zaXRpb24gdHlwZSBvZiB0aGlzIGZpZWxkIGlzDQorICAgICAqIDxpPmF0dGFjaG1lbnQ8L2k+LCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KKyAgICAgKiANCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlzcG9zaXRpb24gdHlwZSBvZiB0aGlzIGZpZWxkIGlzDQorICAgICAqICAgICAgICAgPGk+YXR0YWNobWVudDwvaT4sIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F0dGFjaG1lbnQoKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIGRpc3Bvc2l0aW9uVHlwZS5lcXVhbHMoRElTUE9TSVRJT05fVFlQRV9BVFRBQ0hNRU5UKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZpbGVuYW1lPC9jb2RlPiBwYXJhbWV0ZXIgaWYgc2V0Lg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPg0KKyAgICAgKiAgICAgICAgIGlmIG5vdCBzZXQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcihQQVJBTV9GSUxFTkFNRSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5jcmVhdGlvbi1kYXRlPC9jb2RlPiBwYXJhbWV0ZXIgaWYgc2V0IGFuZA0KKyAgICAgKiB2YWxpZC4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPmNyZWF0aW9uLWRhdGU8L2NvZGU+IHBhcmFtZXRlciB2YWx1ZSBvcg0KKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQgb3IgaW52YWxpZC4NCisgICAgICovDQorICAgIHB1YmxpYyBEYXRlIGdldENyZWF0aW9uRGF0ZSgpIHsNCisgICAgICAgIGlmICghY3JlYXRpb25EYXRlUGFyc2VkKSB7DQorICAgICAgICAgICAgY3JlYXRpb25EYXRlID0gcGFyc2VEYXRlKFBBUkFNX0NSRUFUSU9OX0RBVEUpOw0KKyAgICAgICAgICAgIGNyZWF0aW9uRGF0ZVBhcnNlZCA9IHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gY3JlYXRpb25EYXRlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+bW9kaWZpY2F0aW9uLWRhdGU8L2NvZGU+IHBhcmFtZXRlciBpZiBzZXQNCisgICAgICogYW5kIHZhbGlkLg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+bW9kaWZpY2F0aW9uLWRhdGU8L2NvZGU+IHBhcmFtZXRlciB2YWx1ZSBvcg0KKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQgb3IgaW52YWxpZC4NCisgICAgICovDQorICAgIHB1YmxpYyBEYXRlIGdldE1vZGlmaWNhdGlvbkRhdGUoKSB7DQorICAgICAgICBpZiAoIW1vZGlmaWNhdGlvbkRhdGVQYXJzZWQpIHsNCisgICAgICAgICAgICBtb2RpZmljYXRpb25EYXRlID0gcGFyc2VEYXRlKFBBUkFNX01PRElGSUNBVElPTl9EQVRFKTsNCisgICAgICAgICAgICBtb2RpZmljYXRpb25EYXRlUGFyc2VkID0gdHJ1ZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBtb2RpZmljYXRpb25EYXRlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+cmVhZC1kYXRlPC9jb2RlPiBwYXJhbWV0ZXIgaWYgc2V0IGFuZA0KKyAgICAgKiB2YWxpZC4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPnJlYWQtZGF0ZTwvY29kZT4gcGFyYW1ldGVyIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAqICAgICAgICAgaWYgbm90IHNldCBvciBpbnZhbGlkLg0KKyAgICAgKi8NCisgICAgcHVibGljIERhdGUgZ2V0UmVhZERhdGUoKSB7DQorICAgICAgICBpZiAoIXJlYWREYXRlUGFyc2VkKSB7DQorICAgICAgICAgICAgcmVhZERhdGUgPSBwYXJzZURhdGUoUEFSQU1fUkVBRF9EQVRFKTsNCisgICAgICAgICAgICByZWFkRGF0ZVBhcnNlZCA9IHRydWU7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gcmVhZERhdGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5zaXplPC9jb2RlPiBwYXJhbWV0ZXIgaWYgc2V0IGFuZCB2YWxpZC4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPnNpemU8L2NvZGU+IHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT4tMTwvY29kZT4gaWYNCisgICAgICogICAgICAgICBub3Qgc2V0IG9yIGludmFsaWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgew0KKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0UGFyYW1ldGVyKFBBUkFNX1NJWkUpOw0KKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIC0xOw0KKw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBsb25nIHNpemUgPSBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7DQorICAgICAgICAgICAgcmV0dXJuIHNpemUgPCAwID8gLTEgOiBzaXplOw0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBEYXRlIHBhcnNlRGF0ZShTdHJpbmcgcGFyYW1OYW1lKSB7DQorICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRQYXJhbWV0ZXIocGFyYW1OYW1lKTsNCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7DQorICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyc2luZyAiICsgcGFyYW1OYW1lICsgIiBudWxsIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lUGFyc2VyKG5ldyBTdHJpbmdSZWFkZXIodmFsdWUpKS5wYXJzZUFsbCgpDQorICAgICAgICAgICAgICAgICAgICAuZ2V0RGF0ZSgpOw0KKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcnNpbmcgIiArIHBhcmFtTmFtZSArICIgJyIgKyB2YWx1ZSArICInOiAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuZGF0ZXRpbWUucGFyc2VyLlRva2VuTWdyRXJyb3IgZSkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcnNpbmcgIiArIHBhcmFtTmFtZSArICIgJyIgKyB2YWx1ZSArICInOiAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBwYXJzZSgpIHsNCisgICAgICAgIFN0cmluZyBib2R5ID0gZ2V0Qm9keSgpOw0KKw0KKyAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uUGFyc2VyIHBhcnNlciA9IG5ldyBDb250ZW50RGlzcG9zaXRpb25QYXJzZXIoDQorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoYm9keSkpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBwYXJzZXIucGFyc2VBbGwoKTsNCisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJzaW5nIHZhbHVlICciICsgYm9keSArICInOiAiICsgZS5nZXRNZXNzYWdlKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwYXJzZUV4Y2VwdGlvbiA9IGU7DQorICAgICAgICB9IGNhdGNoIChUb2tlbk1nckVycm9yIGUpIHsNCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJzaW5nIHZhbHVlICciICsgYm9keSArICInOiAiICsgZS5nZXRNZXNzYWdlKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwYXJzZUV4Y2VwdGlvbiA9IG5ldyBQYXJzZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBmaW5hbCBTdHJpbmcgZGlzcG9zaXRpb25UeXBlID0gcGFyc2VyLmdldERpc3Bvc2l0aW9uVHlwZSgpOw0KKw0KKyAgICAgICAgaWYgKGRpc3Bvc2l0aW9uVHlwZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgdGhpcy5kaXNwb3NpdGlvblR5cGUgPSBkaXNwb3NpdGlvblR5cGUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsNCisNCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gcGFyYW1OYW1lcyA9IHBhcnNlci5nZXRQYXJhbU5hbWVzKCk7DQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFtVmFsdWVzID0gcGFyc2VyLmdldFBhcmFtVmFsdWVzKCk7DQorDQorICAgICAgICAgICAgaWYgKHBhcmFtTmFtZXMgIT0gbnVsbCAmJiBwYXJhbVZhbHVlcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW4gPSBNYXRoLm1pbihwYXJhbU5hbWVzLnNpemUoKSwgcGFyYW1WYWx1ZXMuc2l6ZSgpKTsNCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtTmFtZXMuZ2V0KGkpLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7DQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1WYWx1ZSA9IHBhcmFtVmFsdWVzLmdldChpKTsNCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBwYXJzZWQgPSB0cnVlOw0KKyAgICB9DQorDQorICAgIHN0YXRpYyBmaW5hbCBGaWVsZFBhcnNlciBQQVJTRVIgPSBuZXcgRmllbGRQYXJzZXIoKSB7DQorICAgICAgICBwdWJsaWMgUGFyc2VkRmllbGQgcGFyc2UoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBib2R5LA0KKyAgICAgICAgICAgICAgICBmaW5hbCBCeXRlU2VxdWVuY2UgcmF3KSB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250ZW50RGlzcG9zaXRpb25GaWVsZChuYW1lLCBib2R5LCByYXcpOw0KKyAgICAgICAgfQ0KKyAgICB9Ow0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTlhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5CeXRlU2VxdWVuY2U7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuTWltZVV0aWw7DQorDQorLyoqDQorICogUmVwcmVzZW50cyBhIDxjb2RlPkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc8L2NvZGU+IGZpZWxkLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkIGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7DQorICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOw0KKw0KKyAgICBDb250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkKFN0cmluZyBuYW1lLCBTdHJpbmcgYm9keSwgQnl0ZVNlcXVlbmNlIHJhdykgew0KKyAgICAgICAgc3VwZXIobmFtZSwgYm9keSwgcmF3KTsNCisgICAgICAgIGVuY29kaW5nID0gYm9keS50cmltKCkudG9Mb3dlckNhc2UoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0cyB0aGUgZW5jb2RpbmcgZGVmaW5lZCBpbiB0aGlzIGZpZWxkLg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgZW5jb2Rpbmcgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vdCBzZXQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgew0KKyAgICAgICAgcmV0dXJuIGVuY29kaW5nOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSBlbmNvZGluZyBvZiB0aGUgZ2l2ZW4gZmllbGQgaWYuIFJldHVybnMgdGhlIGRlZmF1bHQNCisgICAgICogPGNvZGU+N2JpdDwvY29kZT4gaWYgbm90IHNldCBvciBpZiA8Y29kZT5mPC9jb2RlPiBpcw0KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPi4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gdGhlIGVuY29kaW5nLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZCBmKSB7DQorICAgICAgICBpZiAoZiAhPSBudWxsICYmIGYuZ2V0RW5jb2RpbmcoKS5sZW5ndGgoKSAhPSAwKSB7DQorICAgICAgICAgICAgcmV0dXJuIGYuZ2V0RW5jb2RpbmcoKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBNaW1lVXRpbC5FTkNfN0JJVDsNCisgICAgfQ0KKw0KKyAgICBzdGF0aWMgZmluYWwgRmllbGRQYXJzZXIgUEFSU0VSID0gbmV3IEZpZWxkUGFyc2VyKCkgew0KKyAgICAgICAgcHVibGljIFBhcnNlZEZpZWxkIHBhcnNlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgYm9keSwNCisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVNlcXVlbmNlIHJhdykgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZChuYW1lLCBib2R5LCByYXcpOw0KKyAgICAgICAgfQ0KKyAgICB9Ow0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0NvbnRlbnRUeXBlRmllbGQuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvQ29udGVudFR5cGVGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGY2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0NvbnRlbnRUeXBlRmllbGQuamF2YQpAQCAtMCwwICsxLDI1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7DQorDQoraW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5jb250ZW50dHlwZS5wYXJzZXIuQ29udGVudFR5cGVQYXJzZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmNvbnRlbnR0eXBlLnBhcnNlci5QYXJzZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuY29udGVudHR5cGUucGFyc2VyLlRva2VuTWdyRXJyb3I7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOw0KKw0KKy8qKg0KKyAqIFJlcHJlc2VudHMgYSA8Y29kZT5Db250ZW50LVR5cGU8L2NvZGU+IGZpZWxkLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDb250ZW50VHlwZUZpZWxkIGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7DQorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDb250ZW50VHlwZUZpZWxkLmNsYXNzKTsNCisNCisgICAgLyoqIFRoZSBwcmVmaXggb2YgYWxsIDxjb2RlPm11bHRpcGFydDwvY29kZT4gTUlNRSB0eXBlcy4gKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NVUxUSVBBUlRfUFJFRklYID0gIm11bHRpcGFydC8iOw0KKw0KKyAgICAvKiogVGhlIDxjb2RlPm11bHRpcGFydC9kaWdlc3Q8L2NvZGU+IE1JTUUgdHlwZS4gKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NVUxUSVBBUlRfRElHRVNUID0gIm11bHRpcGFydC9kaWdlc3QiOw0KKw0KKyAgICAvKiogVGhlIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+IE1JTUUgdHlwZS4gKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9URVhUX1BMQUlOID0gInRleHQvcGxhaW4iOw0KKw0KKyAgICAvKiogVGhlIDxjb2RlPm1lc3NhZ2UvcmZjODIyPC9jb2RlPiBNSU1FIHR5cGUuICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUVTU0FHRV9SRkM4MjIgPSAibWVzc2FnZS9yZmM4MjIiOw0KKw0KKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIDxjb2RlPmJvdW5kYXJ5PC9jb2RlPiBwYXJhbWV0ZXIuICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0JPVU5EQVJZID0gImJvdW5kYXJ5IjsNCisNCisgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5jaGFyc2V0PC9jb2RlPiBwYXJhbWV0ZXIuICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NIQVJTRVQgPSAiY2hhcnNldCI7DQorDQorICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZWQgPSBmYWxzZTsNCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgbWltZVR5cGUgPSAiIjsNCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsNCisgICAgcHJpdmF0ZSBQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbjsNCisNCisgICAgQ29udGVudFR5cGVGaWVsZChTdHJpbmcgbmFtZSwgU3RyaW5nIGJvZHksIEJ5dGVTZXF1ZW5jZSByYXcpIHsNCisgICAgICAgIHN1cGVyKG5hbWUsIGJvZHksIHJhdyk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyByYWlzZWQgZHVyaW5nIHBhcnNpbmcgb2YgdGhlIGZpZWxkIHZhbHVlLCBpZg0KKyAgICAgKiBhbnk7IG90aGVyd2lzZSwgbnVsbC4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2V0UGFyc2VFeGNlcHRpb24oKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIHBhcnNlRXhjZXB0aW9uOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSBNSU1FIHR5cGUgZGVmaW5lZCBpbiB0aGlzIENvbnRlbnQtVHlwZSBmaWVsZC4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gdGhlIE1JTUUgdHlwZSBvciBhbiBlbXB0eSBzdHJpbmcgaWYgbm90IHNldC4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZVR5cGUoKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIG1pbWVUeXBlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4gUGFyYW1ldGVyIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIG5hbWUNCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGdldC4NCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgew0KKyAgICAgICAgaWYgKCFwYXJzZWQpDQorICAgICAgICAgICAgcGFyc2UoKTsNCisNCisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmdldChuYW1lLnRvTG93ZXJDYXNlKCkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIGFsbCBwYXJhbWV0ZXJzLg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVycy4NCisgICAgICovDQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtZXRlcnMoKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwYXJhbWV0ZXJzKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgTUlNRSB0eXBlIG9mIHRoaXMgZmllbGQgbWF0Y2hlcyB0aGUgZ2l2ZW4gb25lLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIG1pbWVUeXBlDQorICAgICAqICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB0byBtYXRjaCBhZ2FpbnN0Lg0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBNSU1FIHR5cGUgb2YgdGhpcyBmaWVsZCBtYXRjaGVzLA0KKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01pbWVUeXBlKFN0cmluZyBtaW1lVHlwZSkgew0KKyAgICAgICAgaWYgKCFwYXJzZWQpDQorICAgICAgICAgICAgcGFyc2UoKTsNCisNCisgICAgICAgIHJldHVybiB0aGlzLm1pbWVUeXBlLmVxdWFsc0lnbm9yZUNhc2UobWltZVR5cGUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBNSU1FIHR5cGUgb2YgdGhpcyBmaWVsZCBpcyA8Y29kZT5tdWx0aXBhcnQvKjwvY29kZT4uDQorICAgICAqIA0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZmllbGQgaXMgaGFzIGENCisgICAgICogICAgICAgICA8Y29kZT5tdWx0aXBhcnQvKjwvY29kZT4gTUlNRSB0eXBlLCA8Y29kZT5mYWxzZTwvY29kZT4NCisgICAgICogICAgICAgICBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpcGFydCgpIHsNCisgICAgICAgIGlmICghcGFyc2VkKQ0KKyAgICAgICAgICAgIHBhcnNlKCk7DQorDQorICAgICAgICByZXR1cm4gbWltZVR5cGUuc3RhcnRzV2l0aChUWVBFX01VTFRJUEFSVF9QUkVGSVgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Ym91bmRhcnk8L2NvZGU+IHBhcmFtZXRlciBpZiBzZXQuDQorICAgICAqIA0KKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5ib3VuZGFyeTwvY29kZT4gcGFyYW1ldGVyIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+DQorICAgICAqICAgICAgICAgaWYgbm90IHNldC4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm91bmRhcnkoKSB7DQorICAgICAgICByZXR1cm4gZ2V0UGFyYW1ldGVyKFBBUkFNX0JPVU5EQVJZKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmNoYXJzZXQ8L2NvZGU+IHBhcmFtZXRlciBpZiBzZXQuDQorICAgICAqIA0KKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5jaGFyc2V0PC9jb2RlPiBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4NCisgICAgICogICAgICAgICBpZiBub3Qgc2V0Lg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgew0KKyAgICAgICAgcmV0dXJuIGdldFBhcmFtZXRlcihQQVJBTV9DSEFSU0VUKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0cyB0aGUgTUlNRSB0eXBlIGRlZmluZWQgaW4gdGhlIGNoaWxkJ3MgQ29udGVudC1UeXBlIGZpZWxkIG9yIGRlcml2ZXMgYQ0KKyAgICAgKiBNSU1FIHR5cGUgZnJvbSB0aGUgcGFyZW50IGlmIGNoaWxkIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGhhc24ndCBnb3QgYQ0KKyAgICAgKiBNSU1FIHR5cGUgdmFsdWUgc2V0LiBJZiBjaGlsZCdzIE1JTUUgdHlwZSBpcyBtdWx0aXBhcnQgYnV0IG5vIGJvdW5kYXJ5DQorICAgICAqIGhhcyBiZWVuIHNldCB0aGUgTUlNRSB0eXBlIG9mIGNoaWxkIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBwYXJlbnQuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gY2hpbGQNCisgICAgICogICAgICAgICAgICB0aGUgY2hpbGQuDQorICAgICAqIEBwYXJhbSBwYXJlbnQNCisgICAgICogICAgICAgICAgICB0aGUgcGFyZW50Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBNSU1FIHR5cGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNaW1lVHlwZShDb250ZW50VHlwZUZpZWxkIGNoaWxkLA0KKyAgICAgICAgICAgIENvbnRlbnRUeXBlRmllbGQgcGFyZW50KSB7DQorICAgICAgICBpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXRNaW1lVHlwZSgpLmxlbmd0aCgpID09IDANCisgICAgICAgICAgICAgICAgfHwgY2hpbGQuaXNNdWx0aXBhcnQoKSAmJiBjaGlsZC5nZXRCb3VuZGFyeSgpID09IG51bGwpIHsNCisNCisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmlzTWltZVR5cGUoVFlQRV9NVUxUSVBBUlRfRElHRVNUKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFlQRV9NRVNTQUdFX1JGQzgyMjsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICByZXR1cm4gVFlQRV9URVhUX1BMQUlOOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBjaGlsZC5nZXRNaW1lVHlwZSgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Y2hhcnNldDwvY29kZT4gcGFyYW1ldGVyIGlmIHNldCBmb3IgdGhlDQorICAgICAqIGdpdmVuIGZpZWxkLiBSZXR1cm5zIHRoZSBkZWZhdWx0IDxjb2RlPnVzLWFzY2lpPC9jb2RlPiBpZiBub3Qgc2V0IG9yIGlmDQorICAgICAqIDxjb2RlPmY8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Lg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgPGNvZGU+Y2hhcnNldDwvY29kZT4gcGFyYW1ldGVyIHZhbHVlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2hhcnNldChDb250ZW50VHlwZUZpZWxkIGYpIHsNCisgICAgICAgIGlmIChmICE9IG51bGwpIHsNCisgICAgICAgICAgICBTdHJpbmcgY2hhcnNldCA9IGYuZ2V0Q2hhcnNldCgpOw0KKyAgICAgICAgICAgIGlmIChjaGFyc2V0ICE9IG51bGwgJiYgY2hhcnNldC5sZW5ndGgoKSA+IDApIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJzZXQ7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuICJ1cy1hc2NpaSI7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkgew0KKyAgICAgICAgU3RyaW5nIGJvZHkgPSBnZXRCb2R5KCk7DQorDQorICAgICAgICBDb250ZW50VHlwZVBhcnNlciBwYXJzZXIgPSBuZXcgQ29udGVudFR5cGVQYXJzZXIobmV3IFN0cmluZ1JlYWRlcihib2R5KSk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHBhcnNlci5wYXJzZUFsbCgpOw0KKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcnNpbmcgdmFsdWUgJyIgKyBib2R5ICsgIic6ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gZTsNCisgICAgICAgIH0gY2F0Y2ggKFRva2VuTWdyRXJyb3IgZSkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcnNpbmcgdmFsdWUgJyIgKyBib2R5ICsgIic6ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gbmV3IFBhcnNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlID0gcGFyc2VyLmdldFR5cGUoKTsNCisgICAgICAgIGZpbmFsIFN0cmluZyBzdWJUeXBlID0gcGFyc2VyLmdldFN1YlR5cGUoKTsNCisNCisgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgc3ViVHlwZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgbWltZVR5cGUgPSAodHlwZSArICIvIiArIHN1YlR5cGUpLnRvTG93ZXJDYXNlKCk7DQorDQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhcmFtTmFtZXMgPSBwYXJzZXIuZ2V0UGFyYW1OYW1lcygpOw0KKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXJhbVZhbHVlcyA9IHBhcnNlci5nZXRQYXJhbVZhbHVlcygpOw0KKw0KKyAgICAgICAgICAgIGlmIChwYXJhbU5hbWVzICE9IG51bGwgJiYgcGFyYW1WYWx1ZXMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuID0gTWF0aC5taW4ocGFyYW1OYW1lcy5zaXplKCksIHBhcmFtVmFsdWVzLnNpemUoKSk7DQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsNCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBwYXJhbU5hbWVzLmdldChpKS50b0xvd2VyQ2FzZSgpOw0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtVmFsdWUgPSBwYXJhbVZhbHVlcy5nZXQoaSk7DQorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChwYXJhbU5hbWUsIHBhcmFtVmFsdWUpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcGFyc2VkID0gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgICBzdGF0aWMgZmluYWwgRmllbGRQYXJzZXIgUEFSU0VSID0gbmV3IEZpZWxkUGFyc2VyKCkgew0KKyAgICAgICAgcHVibGljIFBhcnNlZEZpZWxkIHBhcnNlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgYm9keSwNCisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVNlcXVlbmNlIHJhdykgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGVudFR5cGVGaWVsZChuYW1lLCBib2R5LCByYXcpOw0KKyAgICAgICAgfQ0KKyAgICB9Ow0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0RhdGVUaW1lRmllbGQuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvRGF0ZVRpbWVGaWVsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMGY1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0RhdGVUaW1lRmllbGQuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZDsNCisNCitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7DQoraW1wb3J0IGphdmEudXRpbC5EYXRlOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmRhdGV0aW1lLnBhcnNlci5EYXRlVGltZVBhcnNlcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuZGF0ZXRpbWUucGFyc2VyLlBhcnNlRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5kYXRldGltZS5wYXJzZXIuVG9rZW5NZ3JFcnJvcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5CeXRlU2VxdWVuY2U7DQorDQorLyoqDQorICogRGF0ZS10aW1lIGZpZWxkIHN1Y2ggYXMgPGNvZGU+RGF0ZTwvY29kZT4gb3IgPGNvZGU+UmVzZW50LURhdGU8L2NvZGU+Lg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBEYXRlVGltZUZpZWxkIGV4dGVuZHMgQWJzdHJhY3RGaWVsZCB7DQorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEYXRlVGltZUZpZWxkLmNsYXNzKTsNCisNCisgICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlZCA9IGZhbHNlOw0KKw0KKyAgICBwcml2YXRlIERhdGUgZGF0ZTsNCisgICAgcHJpdmF0ZSBQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbjsNCisNCisgICAgRGF0ZVRpbWVGaWVsZChTdHJpbmcgbmFtZSwgU3RyaW5nIGJvZHksIEJ5dGVTZXF1ZW5jZSByYXcpIHsNCisgICAgICAgIHN1cGVyKG5hbWUsIGJvZHksIHJhdyk7DQorICAgIH0NCisNCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZSgpIHsNCisgICAgICAgIGlmICghcGFyc2VkKQ0KKyAgICAgICAgICAgIHBhcnNlKCk7DQorDQorICAgICAgICByZXR1cm4gZGF0ZTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdldFBhcnNlRXhjZXB0aW9uKCkgew0KKyAgICAgICAgaWYgKCFwYXJzZWQpDQorICAgICAgICAgICAgcGFyc2UoKTsNCisNCisgICAgICAgIHJldHVybiBwYXJzZUV4Y2VwdGlvbjsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgcGFyc2UoKSB7DQorICAgICAgICBTdHJpbmcgYm9keSA9IGdldEJvZHkoKTsNCisNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlVGltZVBhcnNlcihuZXcgU3RyaW5nUmVhZGVyKGJvZHkpKS5wYXJzZUFsbCgpDQorICAgICAgICAgICAgICAgICAgICAuZ2V0RGF0ZSgpOw0KKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcnNpbmcgdmFsdWUgJyIgKyBib2R5ICsgIic6ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gZTsNCisgICAgICAgIH0gY2F0Y2ggKFRva2VuTWdyRXJyb3IgZSkgew0KKyAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgew0KKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlBhcnNpbmcgdmFsdWUgJyIgKyBib2R5ICsgIic6ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHBhcnNlRXhjZXB0aW9uID0gbmV3IFBhcnNlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHBhcnNlZCA9IHRydWU7DQorICAgIH0NCisNCisgICAgc3RhdGljIGZpbmFsIEZpZWxkUGFyc2VyIFBBUlNFUiA9IG5ldyBGaWVsZFBhcnNlcigpIHsNCisgICAgICAgIHB1YmxpYyBQYXJzZWRGaWVsZCBwYXJzZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGJvZHksDQorICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVTZXF1ZW5jZSByYXcpIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lRmllbGQobmFtZSwgYm9keSwgcmF3KTsNCisgICAgICAgIH0NCisgICAgfTsNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9EZWZhdWx0RmllbGRQYXJzZXIuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvRGVmYXVsdEZpZWxkUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiNzBjNwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvRGVmYXVsdEZpZWxkUGFyc2VyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7DQorDQorcHVibGljIGNsYXNzIERlZmF1bHRGaWVsZFBhcnNlciBleHRlbmRzIERlbGVnYXRpbmdGaWVsZFBhcnNlciB7DQorDQorICAgIHB1YmxpYyBEZWZhdWx0RmllbGRQYXJzZXIoKSB7DQorICAgICAgICBzZXRGaWVsZFBhcnNlcihGaWVsZE5hbWUuQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORywNCisgICAgICAgICAgICAgICAgQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZC5QQVJTRVIpOw0KKyAgICAgICAgc2V0RmllbGRQYXJzZXIoRmllbGROYW1lLkNPTlRFTlRfVFlQRSwgQ29udGVudFR5cGVGaWVsZC5QQVJTRVIpOw0KKyAgICAgICAgc2V0RmllbGRQYXJzZXIoRmllbGROYW1lLkNPTlRFTlRfRElTUE9TSVRJT04sDQorICAgICAgICAgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkLlBBUlNFUik7DQorDQorICAgICAgICBmaW5hbCBGaWVsZFBhcnNlciBkYXRlVGltZVBhcnNlciA9IERhdGVUaW1lRmllbGQuUEFSU0VSOw0KKyAgICAgICAgc2V0RmllbGRQYXJzZXIoRmllbGROYW1lLkRBVEUsIGRhdGVUaW1lUGFyc2VyKTsNCisgICAgICAgIHNldEZpZWxkUGFyc2VyKEZpZWxkTmFtZS5SRVNFTlRfREFURSwgZGF0ZVRpbWVQYXJzZXIpOw0KKw0KKyAgICAgICAgZmluYWwgRmllbGRQYXJzZXIgbWFpbGJveExpc3RQYXJzZXIgPSBNYWlsYm94TGlzdEZpZWxkLlBBUlNFUjsNCisgICAgICAgIHNldEZpZWxkUGFyc2VyKEZpZWxkTmFtZS5GUk9NLCBtYWlsYm94TGlzdFBhcnNlcik7DQorICAgICAgICBzZXRGaWVsZFBhcnNlcihGaWVsZE5hbWUuUkVTRU5UX0ZST00sIG1haWxib3hMaXN0UGFyc2VyKTsNCisNCisgICAgICAgIGZpbmFsIEZpZWxkUGFyc2VyIG1haWxib3hQYXJzZXIgPSBNYWlsYm94RmllbGQuUEFSU0VSOw0KKyAgICAgICAgc2V0RmllbGRQYXJzZXIoRmllbGROYW1lLlNFTkRFUiwgbWFpbGJveFBhcnNlcik7DQorICAgICAgICBzZXRGaWVsZFBhcnNlcihGaWVsZE5hbWUuUkVTRU5UX1NFTkRFUiwgbWFpbGJveFBhcnNlcik7DQorDQorICAgICAgICBmaW5hbCBGaWVsZFBhcnNlciBhZGRyZXNzTGlzdFBhcnNlciA9IEFkZHJlc3NMaXN0RmllbGQuUEFSU0VSOw0KKyAgICAgICAgc2V0RmllbGRQYXJzZXIoRmllbGROYW1lLlRPLCBhZGRyZXNzTGlzdFBhcnNlcik7DQorICAgICAgICBzZXRGaWVsZFBhcnNlcihGaWVsZE5hbWUuUkVTRU5UX1RPLCBhZGRyZXNzTGlzdFBhcnNlcik7DQorICAgICAgICBzZXRGaWVsZFBhcnNlcihGaWVsZE5hbWUuQ0MsIGFkZHJlc3NMaXN0UGFyc2VyKTsNCisgICAgICAgIHNldEZpZWxkUGFyc2VyKEZpZWxkTmFtZS5SRVNFTlRfQ0MsIGFkZHJlc3NMaXN0UGFyc2VyKTsNCisgICAgICAgIHNldEZpZWxkUGFyc2VyKEZpZWxkTmFtZS5CQ0MsIGFkZHJlc3NMaXN0UGFyc2VyKTsNCisgICAgICAgIHNldEZpZWxkUGFyc2VyKEZpZWxkTmFtZS5SRVNFTlRfQkNDLCBhZGRyZXNzTGlzdFBhcnNlcik7DQorICAgICAgICBzZXRGaWVsZFBhcnNlcihGaWVsZE5hbWUuUkVQTFlfVE8sIGFkZHJlc3NMaXN0UGFyc2VyKTsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0RlbGVnYXRpbmdGaWVsZFBhcnNlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9EZWxlZ2F0aW5nRmllbGRQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2NmODgzCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9EZWxlZ2F0aW5nRmllbGRQYXJzZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZDsNCisNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOw0KKw0KK3B1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nRmllbGRQYXJzZXIgaW1wbGVtZW50cyBGaWVsZFBhcnNlciB7DQorICAgIA0KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEZpZWxkUGFyc2VyPiBwYXJzZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBGaWVsZFBhcnNlcj4oKTsNCisgICAgcHJpdmF0ZSBGaWVsZFBhcnNlciBkZWZhdWx0UGFyc2VyID0gVW5zdHJ1Y3R1cmVkRmllbGQuUEFSU0VSOw0KKyAgICANCisgICAgLyoqDQorICAgICAqIFNldHMgdGhlIHBhcnNlciB1c2VkIGZvciB0aGUgZmllbGQgbmFtZWQgPGNvZGU+bmFtZTwvY29kZT4uDQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZA0KKyAgICAgKiBAcGFyYW0gcGFyc2VyIHRoZSBwYXJzZXIgZm9yIGZpZWxkcyBuYW1lZCA8Y29kZT5uYW1lPC9jb2RlPg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc2V0RmllbGRQYXJzZXIoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEZpZWxkUGFyc2VyIHBhcnNlcikgew0KKyAgICAgICAgcGFyc2Vycy5wdXQobmFtZS50b0xvd2VyQ2FzZSgpLCBwYXJzZXIpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgRmllbGRQYXJzZXIgZ2V0UGFyc2VyKGZpbmFsIFN0cmluZyBuYW1lKSB7DQorICAgICAgICBmaW5hbCBGaWVsZFBhcnNlciBmaWVsZCA9IHBhcnNlcnMuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7DQorICAgICAgICBpZihmaWVsZD09bnVsbCkgew0KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0UGFyc2VyOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGZpZWxkOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgUGFyc2VkRmllbGQgcGFyc2UoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBib2R5LCBmaW5hbCBCeXRlU2VxdWVuY2UgcmF3KSB7DQorICAgICAgICBmaW5hbCBGaWVsZFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIobmFtZSk7DQorICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlKG5hbWUsIGJvZHksIHJhdyk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9GaWVsZE5hbWUuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvRmllbGROYW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjZmY1MwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvRmllbGROYW1lLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZDsKKworLyoqCisgKiBDb25zdGFudHMgZm9yIGNvbW1vbiBoZWFkZXIgZmllbGQgbmFtZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZE5hbWUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ESVNQT1NJVElPTiA9ICJDb250ZW50LURpc3Bvc2l0aW9uIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HID0gIkNvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmciOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9ICJDb250ZW50LVR5cGUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFURSA9ICJEYXRlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFX0lEID0gIk1lc3NhZ2UtSUQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQkpFQ1QgPSAiU3ViamVjdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUk9NID0gIkZyb20iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTkRFUiA9ICJTZW5kZXIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPID0gIlRvIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQyA9ICJDYyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkNDID0gIkJjYyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTFlfVE8gPSAiUmVwbHktVG8iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRU5UX0RBVEUgPSAiUmVzZW50LURhdGUiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRU5UX0ZST00gPSAiUmVzZW50LUZyb20iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU0VOVF9TRU5ERVIgPSAiUmVzZW50LVNlbmRlciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRU5UX1RPID0gIlJlc2VudC1UbyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRU5UX0NDID0gIlJlc2VudC1DYyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRU5UX0JDQyA9ICJSZXNlbnQtQmNjIjsKKworICAgIHByaXZhdGUgRmllbGROYW1lKCkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9GaWVsZFBhcnNlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9GaWVsZFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTY2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0ZpZWxkUGFyc2VyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOw0KKw0KK3B1YmxpYyBpbnRlcmZhY2UgRmllbGRQYXJzZXIgew0KKyAgICANCisgICAgUGFyc2VkRmllbGQgcGFyc2UoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBib2R5LCBmaW5hbCBCeXRlU2VxdWVuY2UgcmF3KTsNCisgICAgDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvRmllbGRzLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0ZpZWxkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYmNmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0ZpZWxkcy5qYXZhCkBAIC0wLDAgKzEsNjMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5FbmNvZGVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLkFkZHJlc3M7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkJ5dGVTZXF1ZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNvbnRlbnRVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuTWltZVV0aWw7CisKKy8qKgorICogRmFjdG9yeSBmb3IgY29uY3JldGUge0BsaW5rIEZpZWxkfSBpbnN0YW5jZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWVsZHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGSUVMRF9OQU1FX1BBVFRFUk4gPSBQYXR0ZXJuCisgICAgICAgICAgICAuY29tcGlsZSgiW1xceDIxLVxceDM5XFx4M2ItXFx4N2VdKyIpOworCisgICAgcHJpdmF0ZSBGaWVsZHMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkNvbnRlbnQtVHlwZTwvaT4gZmllbGQgZnJvbSB0aGUgc3BlY2lmaWVkIHJhdyBmaWVsZCB2YWx1ZS4KKyAgICAgKiBUaGUgc3BlY2lmaWVkIHN0cmluZyBnZXRzIGZvbGRlZCBpbnRvIGEgbXVsdGlwbGUtbGluZSByZXByZXNlbnRhdGlvbiBpZgorICAgICAqIG5lY2Vzc2FyeSBidXQgaXMgb3RoZXJ3aXNlIHRha2VuIGFzIGlzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZW50VHlwZQorICAgICAqICAgICAgICAgICAgcmF3IGNvbnRlbnQgdHlwZSBjb250YWluaW5nIGEgTUlNRSB0eXBlIGFuZCBvcHRpb25hbAorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPkNvbnRlbnQtVHlwZTwvaT4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250ZW50VHlwZUZpZWxkIGNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgeworICAgICAgICByZXR1cm4gcGFyc2UoQ29udGVudFR5cGVGaWVsZC5QQVJTRVIsIEZpZWxkTmFtZS5DT05URU5UX1RZUEUsCisgICAgICAgICAgICAgICAgY29udGVudFR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8aT5Db250ZW50LVR5cGU8L2k+IGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCBNSU1FIHR5cGUgYW5kCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUKKyAgICAgKiAgICAgICAgICAgIGEgTUlNRSB0eXBlIChzdWNoIGFzIDxjb2RlPiZxdW90O3RleHQvcGxhaW4mcXVvdDs8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICA8Y29kZT4mcXVvdDthcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0mcXVvdDs8L2NvZGU+KS4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgbWFwIGNvbnRhaW5pbmcgY29udGVudC10eXBlIHBhcmFtZXRlcnMgc3VjaCBhcworICAgICAqICAgICAgICAgICAgPGNvZGU+JnF1b3Q7Ym91bmRhcnkmcXVvdDs8L2NvZGU+LgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+Q29udGVudC1UeXBlPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRUeXBlRmllbGQgY29udGVudFR5cGUoU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGlmICghaXNWYWxpZE1pbWVUeXBlKG1pbWVUeXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsIHx8IHBhcmFtZXRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2UoQ29udGVudFR5cGVGaWVsZC5QQVJTRVIsIEZpZWxkTmFtZS5DT05URU5UX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihtaW1lVHlwZSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBwYXJhbWV0ZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjsgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEVuY29kZXJVdGlsLmVuY29kZUhlYWRlclBhcmFtZXRlcihlbnRyeS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50VHlwZSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gY29udGVudFR5cGUoY29udGVudFR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc8L2k+IGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCByYXcKKyAgICAgKiBmaWVsZCB2YWx1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGVudFRyYW5zZmVyRW5jb2RpbmcKKyAgICAgKiAgICAgICAgICAgIGFuIGVuY29kaW5nIG1lY2hhbmlzbSBzdWNoIGFzIDxjb2RlPiZxdW90OzctYml0JnF1b3Q7PC9jb2RlPgorICAgICAqICAgICAgICAgICAgb3IgPGNvZGU+JnF1b3Q7cXVvdGVkLXByaW50YWJsZSZxdW90OzwvY29kZT4uCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQgY29udGVudFRyYW5zZmVyRW5jb2RpbmcoCisgICAgICAgICAgICBTdHJpbmcgY29udGVudFRyYW5zZmVyRW5jb2RpbmcpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKENvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQuUEFSU0VSLAorICAgICAgICAgICAgICAgIEZpZWxkTmFtZS5DT05URU5UX1RSQU5TRkVSX0VOQ09ESU5HLCBjb250ZW50VHJhbnNmZXJFbmNvZGluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkNvbnRlbnQtRGlzcG9zaXRpb248L2k+IGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCByYXcgZmllbGQKKyAgICAgKiB2YWx1ZS4gVGhlIHNwZWNpZmllZCBzdHJpbmcgZ2V0cyBmb2xkZWQgaW50byBhIG11bHRpcGxlLWxpbmUKKyAgICAgKiByZXByZXNlbnRhdGlvbiBpZiBuZWNlc3NhcnkgYnV0IGlzIG90aGVyd2lzZSB0YWtlbiBhcyBpcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY29udGVudERpc3Bvc2l0aW9uCisgICAgICogICAgICAgICAgICByYXcgY29udGVudCBkaXNwb3NpdGlvbiBjb250YWluaW5nIGEgZGlzcG9zaXRpb24gdHlwZSBhbmQKKyAgICAgKiAgICAgICAgICAgIG9wdGlvbmFsIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5Db250ZW50LURpc3Bvc2l0aW9uPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGNvbnRlbnREaXNwb3NpdGlvbigKKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50RGlzcG9zaXRpb24pIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkLlBBUlNFUiwKKyAgICAgICAgICAgICAgICBGaWVsZE5hbWUuQ09OVEVOVF9ESVNQT1NJVElPTiwgY29udGVudERpc3Bvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+Q29udGVudC1EaXNwb3NpdGlvbjwvaT4gZmllbGQgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogZGlzcG9zaXRpb24gdHlwZSBhbmQgcGFyYW1ldGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGlzcG9zaXRpb25UeXBlCisgICAgICogICAgICAgICAgICBhIGRpc3Bvc2l0aW9uIHR5cGUgKHVzdWFsbHkgPGNvZGU+JnF1b3Q7aW5saW5lJnF1b3Q7PC9jb2RlPgorICAgICAqICAgICAgICAgICAgb3IgPGNvZGU+JnF1b3Q7YXR0YWNobWVudCZxdW90OzwvY29kZT4pLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICBtYXAgY29udGFpbmluZyBkaXNwb3NpdGlvbiBwYXJhbWV0ZXJzIHN1Y2ggYXMKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPiZxdW90O2ZpbGVuYW1lJnF1b3Q7PC9jb2RlPi4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPkNvbnRlbnQtRGlzcG9zaXRpb248L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgY29udGVudERpc3Bvc2l0aW9uKAorICAgICAgICAgICAgU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZSwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGlmICghaXNWYWxpZERpc3Bvc2l0aW9uVHlwZShkaXNwb3NpdGlvblR5cGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwgfHwgcGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZShDb250ZW50RGlzcG9zaXRpb25GaWVsZC5QQVJTRVIsCisgICAgICAgICAgICAgICAgICAgIEZpZWxkTmFtZS5DT05URU5UX0RJU1BPU0lUSU9OLCBkaXNwb3NpdGlvblR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGRpc3Bvc2l0aW9uVHlwZSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBwYXJhbWV0ZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjsgIik7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEVuY29kZXJVdGlsLmVuY29kZUhlYWRlclBhcmFtZXRlcihlbnRyeS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBjb250ZW50RGlzcG9zaXRpb24gPSBzYi50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkNvbnRlbnQtRGlzcG9zaXRpb248L2k+IGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIGRpc3Bvc2l0aW9uIHR5cGUgYW5kIGZpbGVuYW1lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaXNwb3NpdGlvblR5cGUKKyAgICAgKiAgICAgICAgICAgIGEgZGlzcG9zaXRpb24gdHlwZSAodXN1YWxseSA8Y29kZT4mcXVvdDtpbmxpbmUmcXVvdDs8L2NvZGU+CisgICAgICogICAgICAgICAgICBvciA8Y29kZT4mcXVvdDthdHRhY2htZW50JnF1b3Q7PC9jb2RlPikuCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICBmaWxlbmFtZSBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPkNvbnRlbnQtRGlzcG9zaXRpb248L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgY29udGVudERpc3Bvc2l0aW9uKAorICAgICAgICAgICAgU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZSwgU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIHJldHVybiBjb250ZW50RGlzcG9zaXRpb24oZGlzcG9zaXRpb25UeXBlLCBmaWxlbmFtZSwgLTEsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkNvbnRlbnQtRGlzcG9zaXRpb248L2k+IGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCB2YWx1ZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGRpc3Bvc2l0aW9uVHlwZQorICAgICAqICAgICAgICAgICAgYSBkaXNwb3NpdGlvbiB0eXBlICh1c3VhbGx5IDxjb2RlPiZxdW90O2lubGluZSZxdW90OzwvY29kZT4KKyAgICAgKiAgICAgICAgICAgIG9yIDxjb2RlPiZxdW90O2F0dGFjaG1lbnQmcXVvdDs8L2NvZGU+KS4KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgIGZpbGVuYW1lIHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIGluY2x1ZGVkLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICBzaXplIHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT4tMTwvY29kZT4gaWYgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPkNvbnRlbnQtRGlzcG9zaXRpb248L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgY29udGVudERpc3Bvc2l0aW9uKAorICAgICAgICAgICAgU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZSwgU3RyaW5nIGZpbGVuYW1lLCBsb25nIHNpemUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnREaXNwb3NpdGlvbihkaXNwb3NpdGlvblR5cGUsIGZpbGVuYW1lLCBzaXplLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8aT5Db250ZW50LURpc3Bvc2l0aW9uPC9pPiBmaWVsZCBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkaXNwb3NpdGlvblR5cGUKKyAgICAgKiAgICAgICAgICAgIGEgZGlzcG9zaXRpb24gdHlwZSAodXN1YWxseSA8Y29kZT4mcXVvdDtpbmxpbmUmcXVvdDs8L2NvZGU+CisgICAgICogICAgICAgICAgICBvciA8Y29kZT4mcXVvdDthdHRhY2htZW50JnF1b3Q7PC9jb2RlPikuCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICBmaWxlbmFtZSBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgc2l6ZSBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+LTE8L2NvZGU+IGlmIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgIHNob3VsZCBub3QgYmUgaW5jbHVkZWQuCisgICAgICogQHBhcmFtIGNyZWF0aW9uRGF0ZQorICAgICAqICAgICAgICAgICAgY3JlYXRpb24tZGF0ZSBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcGFyYW0gbW9kaWZpY2F0aW9uRGF0ZQorICAgICAqICAgICAgICAgICAgbW9kaWZpY2F0aW9uLWRhdGUgcGFyYW1ldGVyIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgaW5jbHVkZWQuCisgICAgICogQHBhcmFtIHJlYWREYXRlCisgICAgICogICAgICAgICAgICByZWFkLWRhdGUgcGFyYW1ldGVyIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgaW5jbHVkZWQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5Db250ZW50LURpc3Bvc2l0aW9uPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGNvbnRlbnREaXNwb3NpdGlvbigKKyAgICAgICAgICAgIFN0cmluZyBkaXNwb3NpdGlvblR5cGUsIFN0cmluZyBmaWxlbmFtZSwgbG9uZyBzaXplLAorICAgICAgICAgICAgRGF0ZSBjcmVhdGlvbkRhdGUsIERhdGUgbW9kaWZpY2F0aW9uRGF0ZSwgRGF0ZSByZWFkRGF0ZSkgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnRlbnREaXNwb3NpdGlvbkZpZWxkLlBBUkFNX0ZJTEVOQU1FLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPj0gMCkgeworICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29udGVudERpc3Bvc2l0aW9uRmllbGQuUEFSQU1fU0laRSwgTG9uZworICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoc2l6ZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChjcmVhdGlvbkRhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1ldGVycy5wdXQoQ29udGVudERpc3Bvc2l0aW9uRmllbGQuUEFSQU1fQ1JFQVRJT05fREFURSwKKyAgICAgICAgICAgICAgICAgICAgTWltZVV0aWwuZm9ybWF0RGF0ZShjcmVhdGlvbkRhdGUsIG51bGwpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kaWZpY2F0aW9uRGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChDb250ZW50RGlzcG9zaXRpb25GaWVsZC5QQVJBTV9NT0RJRklDQVRJT05fREFURSwKKyAgICAgICAgICAgICAgICAgICAgTWltZVV0aWwuZm9ybWF0RGF0ZShtb2RpZmljYXRpb25EYXRlLCBudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWREYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KENvbnRlbnREaXNwb3NpdGlvbkZpZWxkLlBBUkFNX1JFQURfREFURSwgTWltZVV0aWwKKyAgICAgICAgICAgICAgICAgICAgLmZvcm1hdERhdGUocmVhZERhdGUsIG51bGwpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGVudERpc3Bvc2l0aW9uKGRpc3Bvc2l0aW9uVHlwZSwgcGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkRhdGU8L2k+IGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCA8Y29kZT5EYXRlPC9jb2RlPgorICAgICAqIHZhbHVlLiBUaGUgZGVmYXVsdCB0aW1lIHpvbmUgb2YgdGhlIGhvc3QgaXMgdXNlZCB0byBmb3JtYXQgdGhlIGRhdGUuCisgICAgICogCisgICAgICogQHBhcmFtIGRhdGUKKyAgICAgKiAgICAgICAgICAgIGRhdGUgdmFsdWUgZm9yIHRoZSBoZWFkZXIgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5EYXRlPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lRmllbGQgZGF0ZShEYXRlIGRhdGUpIHsKKyAgICAgICAgcmV0dXJuIGRhdGUwKEZpZWxkTmFtZS5EQVRFLCBkYXRlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZGF0ZSBmaWVsZCBmcm9tIHRoZSBzcGVjaWZpZWQgZmllbGQgbmFtZSBhbmQgPGNvZGU+RGF0ZTwvY29kZT4KKyAgICAgKiB2YWx1ZS4gVGhlIGRlZmF1bHQgdGltZSB6b25lIG9mIHRoZSBob3N0IGlzIHVzZWQgdG8gZm9ybWF0IHRoZSBkYXRlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKKyAgICAgKiAgICAgICAgICAgIGEgZmllbGQgbmFtZSBzdWNoIGFzIDxjb2RlPkRhdGU8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICA8Y29kZT5SZXNlbnQtRGF0ZTwvY29kZT4uCisgICAgICogQHBhcmFtIGRhdGUKKyAgICAgKiAgICAgICAgICAgIGRhdGUgdmFsdWUgZm9yIHRoZSBoZWFkZXIgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBkYXRlIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGF0ZVRpbWVGaWVsZCBkYXRlKFN0cmluZyBmaWVsZE5hbWUsIERhdGUgZGF0ZSkgeworICAgICAgICBjaGVja1ZhbGlkRmllbGROYW1lKGZpZWxkTmFtZSk7CisgICAgICAgIHJldHVybiBkYXRlMChmaWVsZE5hbWUsIGRhdGUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBkYXRlIGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCBmaWVsZCBuYW1lLCA8Y29kZT5EYXRlPC9jb2RlPgorICAgICAqIGFuZCA8Y29kZT5UaW1lWm9uZTwvY29kZT4gdmFsdWVzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWVsZE5hbWUKKyAgICAgKiAgICAgICAgICAgIGEgZmllbGQgbmFtZSBzdWNoIGFzIDxjb2RlPkRhdGU8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICA8Y29kZT5SZXNlbnQtRGF0ZTwvY29kZT4uCisgICAgICogQHBhcmFtIGRhdGUKKyAgICAgKiAgICAgICAgICAgIGRhdGUgdmFsdWUgZm9yIHRoZSBoZWFkZXIgZmllbGQuCisgICAgICogQHBhcmFtIHpvbmUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIHpvbmUgdG8gYmUgdXNlZCBmb3IgZm9ybWF0dGluZyB0aGUgZGF0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIGRhdGUgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEYXRlVGltZUZpZWxkIGRhdGUoU3RyaW5nIGZpZWxkTmFtZSwgRGF0ZSBkYXRlLCBUaW1lWm9uZSB6b25lKSB7CisgICAgICAgIGNoZWNrVmFsaWRGaWVsZE5hbWUoZmllbGROYW1lKTsKKyAgICAgICAgcmV0dXJuIGRhdGUwKGZpZWxkTmFtZSwgZGF0ZSwgem9uZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPk1lc3NhZ2UtSUQ8L2k+IGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIGhvc3QgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaG9zdG5hbWUKKyAgICAgKiAgICAgICAgICAgIGhvc3QgbmFtZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbWVzc2FnZSBJRCBvcgorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaG9zdCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPk1lc3NhZ2UtSUQ8L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmllbGQgbWVzc2FnZUlkKFN0cmluZyBob3N0bmFtZSkgeworICAgICAgICBTdHJpbmcgZmllbGRWYWx1ZSA9IE1pbWVVdGlsLmNyZWF0ZVVuaXF1ZU1lc3NhZ2VJZChob3N0bmFtZSk7CisgICAgICAgIHJldHVybiBwYXJzZShVbnN0cnVjdHVyZWRGaWVsZC5QQVJTRVIsIEZpZWxkTmFtZS5NRVNTQUdFX0lELCBmaWVsZFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+U3ViamVjdDwvaT4gZmllbGQgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyB2YWx1ZS4gVGhlCisgICAgICogc3BlY2lmaWVkIHN0cmluZyBtYXkgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3ViamVjdAorICAgICAqICAgICAgICAgICAgdGhlIHN1YmplY3Qgc3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+U3ViamVjdDwvaT4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVbnN0cnVjdHVyZWRGaWVsZCBzdWJqZWN0KFN0cmluZyBzdWJqZWN0KSB7CisgICAgICAgIGludCB1c2VkQ2hhcmFjdGVycyA9IEZpZWxkTmFtZS5TVUJKRUNULmxlbmd0aCgpICsgMjsKKyAgICAgICAgU3RyaW5nIGZpZWxkVmFsdWUgPSBFbmNvZGVyVXRpbC5lbmNvZGVJZk5lY2Vzc2FyeShzdWJqZWN0LAorICAgICAgICAgICAgICAgIEVuY29kZXJVdGlsLlVzYWdlLlRFWFRfVE9LRU4sIHVzZWRDaGFyYWN0ZXJzKTsKKworICAgICAgICByZXR1cm4gcGFyc2UoVW5zdHJ1Y3R1cmVkRmllbGQuUEFSU0VSLCBGaWVsZE5hbWUuU1VCSkVDVCwgZmllbGRWYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPlNlbmRlcjwvaT4gZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbWFpbGJveCBhZGRyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtYWlsYm94CisgICAgICogICAgICAgICAgICBhZGRyZXNzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPlNlbmRlcjwvaT4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYWlsYm94RmllbGQgc2VuZGVyKE1haWxib3ggbWFpbGJveCkgeworICAgICAgICByZXR1cm4gbWFpbGJveDAoRmllbGROYW1lLlNFTkRFUiwgbWFpbGJveCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkZyb208L2k+IGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG1haWxib3ggYWRkcmVzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbWFpbGJveAorICAgICAqICAgICAgICAgICAgYWRkcmVzcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5Gcm9tPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1haWxib3hMaXN0RmllbGQgZnJvbShNYWlsYm94IG1haWxib3gpIHsKKyAgICAgICAgcmV0dXJuIG1haWxib3hMaXN0MChGaWVsZE5hbWUuRlJPTSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG1haWxib3gpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+RnJvbTwvaT4gZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbWFpbGJveCBhZGRyZXNzZXMuCisgICAgICogCisgICAgICogQHBhcmFtIG1haWxib3hlcworICAgICAqICAgICAgICAgICAgYWRkcmVzc2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPkZyb208L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFpbGJveExpc3RGaWVsZCBmcm9tKE1haWxib3guLi4gbWFpbGJveGVzKSB7CisgICAgICAgIHJldHVybiBtYWlsYm94TGlzdDAoRmllbGROYW1lLkZST00sIEFycmF5cy5hc0xpc3QobWFpbGJveGVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkZyb208L2k+IGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG1haWxib3ggYWRkcmVzc2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtYWlsYm94ZXMKKyAgICAgKiAgICAgICAgICAgIGFkZHJlc3NlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5Gcm9tPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1haWxib3hMaXN0RmllbGQgZnJvbShJdGVyYWJsZTxNYWlsYm94PiBtYWlsYm94ZXMpIHsKKyAgICAgICAgcmV0dXJuIG1haWxib3hMaXN0MChGaWVsZE5hbWUuRlJPTSwgbWFpbGJveGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+VG88L2k+IGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG1haWxib3ggb3IgZ3JvdXAgYWRkcmVzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRkcmVzcworICAgICAqICAgICAgICAgICAgbWFpbGJveCBvciBncm91cCBhZGRyZXNzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPlRvPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NMaXN0RmllbGQgdG8oQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzTGlzdDAoRmllbGROYW1lLlRPLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oYWRkcmVzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8aT5UbzwvaT4gZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbWFpbGJveCBvciBncm91cCBhZGRyZXNzZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFkZHJlc3NlcworICAgICAqICAgICAgICAgICAgbWFpbGJveCBvciBncm91cCBhZGRyZXNzZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+VG88L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0xpc3RGaWVsZCB0byhBZGRyZXNzLi4uIGFkZHJlc3NlcykgeworICAgICAgICByZXR1cm4gYWRkcmVzc0xpc3QwKEZpZWxkTmFtZS5UTywgQXJyYXlzLmFzTGlzdChhZGRyZXNzZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+VG88L2k+IGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG1haWxib3ggb3IgZ3JvdXAgYWRkcmVzc2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGRyZXNzZXMKKyAgICAgKiAgICAgICAgICAgIG1haWxib3ggb3IgZ3JvdXAgYWRkcmVzc2VzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaWVsZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIDxpPlRvPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NMaXN0RmllbGQgdG8oSXRlcmFibGU8QWRkcmVzcz4gYWRkcmVzc2VzKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzTGlzdDAoRmllbGROYW1lLlRPLCBhZGRyZXNzZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8aT5DYzwvaT4gZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbWFpbGJveCBvciBncm91cCBhZGRyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGRyZXNzCisgICAgICogICAgICAgICAgICBtYWlsYm94IG9yIGdyb3VwIGFkZHJlc3MgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+Q2M8L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0xpc3RGaWVsZCBjYyhBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3NMaXN0MChGaWVsZE5hbWUuQ0MsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhZGRyZXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkNjPC9pPiBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBtYWlsYm94IG9yIGdyb3VwIGFkZHJlc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRkcmVzc2VzCisgICAgICogICAgICAgICAgICBtYWlsYm94IG9yIGdyb3VwIGFkZHJlc3NlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5DYzwvaT4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzTGlzdEZpZWxkIGNjKEFkZHJlc3MuLi4gYWRkcmVzc2VzKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzTGlzdDAoRmllbGROYW1lLkNDLCBBcnJheXMuYXNMaXN0KGFkZHJlc3NlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8aT5DYzwvaT4gZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbWFpbGJveCBvciBncm91cCBhZGRyZXNzZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFkZHJlc3NlcworICAgICAqICAgICAgICAgICAgbWFpbGJveCBvciBncm91cCBhZGRyZXNzZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+Q2M8L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0xpc3RGaWVsZCBjYyhJdGVyYWJsZTxBZGRyZXNzPiBhZGRyZXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3NMaXN0MChGaWVsZE5hbWUuQ0MsIGFkZHJlc3Nlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkJjYzwvaT4gZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbWFpbGJveCBvciBncm91cCBhZGRyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGRyZXNzCisgICAgICogICAgICAgICAgICBtYWlsYm94IG9yIGdyb3VwIGFkZHJlc3MgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+QmNjPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NMaXN0RmllbGQgYmNjKEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICByZXR1cm4gYWRkcmVzc0xpc3QwKEZpZWxkTmFtZS5CQ0MsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhZGRyZXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPkJjYzwvaT4gZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbWFpbGJveCBvciBncm91cCBhZGRyZXNzZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFkZHJlc3NlcworICAgICAqICAgICAgICAgICAgbWFpbGJveCBvciBncm91cCBhZGRyZXNzZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+QmNjPC9pPiBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFkZHJlc3NMaXN0RmllbGQgYmNjKEFkZHJlc3MuLi4gYWRkcmVzc2VzKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzTGlzdDAoRmllbGROYW1lLkJDQywgQXJyYXlzLmFzTGlzdChhZGRyZXNzZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+QmNjPC9pPiBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBtYWlsYm94IG9yIGdyb3VwIGFkZHJlc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRkcmVzc2VzCisgICAgICogICAgICAgICAgICBtYWlsYm94IG9yIGdyb3VwIGFkZHJlc3NlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5CY2M8L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0xpc3RGaWVsZCBiY2MoSXRlcmFibGU8QWRkcmVzcz4gYWRkcmVzc2VzKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzTGlzdDAoRmllbGROYW1lLkJDQywgYWRkcmVzc2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+UmVwbHktVG88L2k+IGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG1haWxib3ggb3IgZ3JvdXAKKyAgICAgKiBhZGRyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBhZGRyZXNzCisgICAgICogICAgICAgICAgICBtYWlsYm94IG9yIGdyb3VwIGFkZHJlc3MgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+UmVwbHktVG88L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0xpc3RGaWVsZCByZXBseVRvKEFkZHJlc3MgYWRkcmVzcykgeworICAgICAgICByZXR1cm4gYWRkcmVzc0xpc3QwKEZpZWxkTmFtZS5SRVBMWV9UTywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+UmVwbHktVG88L2k+IGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG1haWxib3ggb3IgZ3JvdXAKKyAgICAgKiBhZGRyZXNzZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFkZHJlc3NlcworICAgICAqICAgICAgICAgICAgbWFpbGJveCBvciBncm91cCBhZGRyZXNzZXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgPGk+UmVwbHktVG88L2k+IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzc0xpc3RGaWVsZCByZXBseVRvKEFkZHJlc3MuLi4gYWRkcmVzc2VzKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzTGlzdDAoRmllbGROYW1lLlJFUExZX1RPLCBBcnJheXMuYXNMaXN0KGFkZHJlc3NlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSA8aT5SZXBseS1UbzwvaT4gZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgbWFpbGJveCBvciBncm91cAorICAgICAqIGFkZHJlc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYWRkcmVzc2VzCisgICAgICogICAgICAgICAgICBtYWlsYm94IG9yIGdyb3VwIGFkZHJlc3NlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZmllbGQuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCA8aT5SZXBseS1UbzwvaT4gZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzTGlzdEZpZWxkIHJlcGx5VG8oSXRlcmFibGU8QWRkcmVzcz4gYWRkcmVzc2VzKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzTGlzdDAoRmllbGROYW1lLlJFUExZX1RPLCBhZGRyZXNzZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBtYWlsYm94IGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCBmaWVsZCBuYW1lIGFuZCBtYWlsYm94CisgICAgICogYWRkcmVzcy4gVmFsaWQgZmllbGQgbmFtZXMgYXJlIDxjb2RlPlNlbmRlcjwvY29kZT4gYW5kCisgICAgICogPGNvZGU+UmVzZW50LVNlbmRlcjwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGZpZWxkTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG1haWxib3ggZmllbGQgKDxjb2RlPlNlbmRlcjwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc2VudC1TZW5kZXI8L2NvZGU+KS4KKyAgICAgKiBAcGFyYW0gbWFpbGJveAorICAgICAqICAgICAgICAgICAgbWFpbGJveCBhZGRyZXNzIGZvciB0aGUgZmllbGQgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBtYWlsYm94IGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFpbGJveEZpZWxkIG1haWxib3goU3RyaW5nIGZpZWxkTmFtZSwgTWFpbGJveCBtYWlsYm94KSB7CisgICAgICAgIGNoZWNrVmFsaWRGaWVsZE5hbWUoZmllbGROYW1lKTsKKyAgICAgICAgcmV0dXJuIG1haWxib3gwKGZpZWxkTmFtZSwgbWFpbGJveCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG1haWxib3gtbGlzdCBmaWVsZCBmcm9tIHRoZSBzcGVjaWZpZWQgZmllbGQgbmFtZSBhbmQgbWFpbGJveAorICAgICAqIGFkZHJlc3Nlcy4gVmFsaWQgZmllbGQgbmFtZXMgYXJlIDxjb2RlPkZyb208L2NvZGU+IGFuZAorICAgICAqIDxjb2RlPlJlc2VudC1Gcm9tPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmllbGROYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgbWFpbGJveCBmaWVsZCAoPGNvZGU+RnJvbTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPlJlc2VudC1Gcm9tPC9jb2RlPikuCisgICAgICogQHBhcmFtIG1haWxib3hlcworICAgICAqICAgICAgICAgICAgbWFpbGJveCBhZGRyZXNzZXMgZm9yIHRoZSBmaWVsZCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG1haWxib3gtbGlzdCBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1haWxib3hMaXN0RmllbGQgbWFpbGJveExpc3QoU3RyaW5nIGZpZWxkTmFtZSwKKyAgICAgICAgICAgIEl0ZXJhYmxlPE1haWxib3g+IG1haWxib3hlcykgeworICAgICAgICBjaGVja1ZhbGlkRmllbGROYW1lKGZpZWxkTmFtZSk7CisgICAgICAgIHJldHVybiBtYWlsYm94TGlzdDAoZmllbGROYW1lLCBtYWlsYm94ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYWRkcmVzcy1saXN0IGZpZWxkIGZyb20gdGhlIHNwZWNpZmllZCBmaWVsZCBuYW1lIGFuZCBtYWlsYm94CisgICAgICogb3IgZ3JvdXAgYWRkcmVzc2VzLiBWYWxpZCBmaWVsZCBuYW1lcyBhcmUgPGNvZGU+VG88L2NvZGU+LAorICAgICAqIDxjb2RlPkNjPC9jb2RlPiwgPGNvZGU+QmNjPC9jb2RlPiwgPGNvZGU+UmVwbHktVG88L2NvZGU+LAorICAgICAqIDxjb2RlPlJlc2VudC1UbzwvY29kZT4sIDxjb2RlPlJlc2VudC1DYzwvY29kZT4gYW5kCisgICAgICogPGNvZGU+UmVzZW50LUJjYzwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGZpZWxkTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG1haWxib3ggZmllbGQgKDxjb2RlPlRvPC9jb2RlPiwKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPkNjPC9jb2RlPiwgPGNvZGU+QmNjPC9jb2RlPiwgPGNvZGU+UmVwbHktVG88L2NvZGU+LAorICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzZW50LVRvPC9jb2RlPiwgPGNvZGU+UmVzZW50LUNjPC9jb2RlPiBvcgorICAgICAqICAgICAgICAgICAgPGNvZGU+UmVzZW50LUJjYzwvY29kZT4pLgorICAgICAqIEBwYXJhbSBhZGRyZXNzZXMKKyAgICAgKiAgICAgICAgICAgIG1haWxib3ggb3IgZ3JvdXAgYWRkcmVzc2VzIGZvciB0aGUgZmllbGQgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBhZGRyZXNzLWxpc3QgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzTGlzdEZpZWxkIGFkZHJlc3NMaXN0KFN0cmluZyBmaWVsZE5hbWUsCisgICAgICAgICAgICBJdGVyYWJsZTxBZGRyZXNzPiBhZGRyZXNzZXMpIHsKKyAgICAgICAgY2hlY2tWYWxpZEZpZWxkTmFtZShmaWVsZE5hbWUpOworICAgICAgICByZXR1cm4gYWRkcmVzc0xpc3QwKGZpZWxkTmFtZSwgYWRkcmVzc2VzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBEYXRlVGltZUZpZWxkIGRhdGUwKFN0cmluZyBmaWVsZE5hbWUsIERhdGUgZGF0ZSwKKyAgICAgICAgICAgIFRpbWVab25lIHpvbmUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdHRlZERhdGUgPSBNaW1lVXRpbC5mb3JtYXREYXRlKGRhdGUsIHpvbmUpOworICAgICAgICByZXR1cm4gcGFyc2UoRGF0ZVRpbWVGaWVsZC5QQVJTRVIsIGZpZWxkTmFtZSwgZm9ybWF0dGVkRGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFpbGJveEZpZWxkIG1haWxib3gwKFN0cmluZyBmaWVsZE5hbWUsIE1haWxib3ggbWFpbGJveCkgeworICAgICAgICBTdHJpbmcgZmllbGRWYWx1ZSA9IGVuY29kZUFkZHJlc3NlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24obWFpbGJveCkpOworICAgICAgICByZXR1cm4gcGFyc2UoTWFpbGJveEZpZWxkLlBBUlNFUiwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYWlsYm94TGlzdEZpZWxkIG1haWxib3hMaXN0MChTdHJpbmcgZmllbGROYW1lLAorICAgICAgICAgICAgSXRlcmFibGU8TWFpbGJveD4gbWFpbGJveGVzKSB7CisgICAgICAgIFN0cmluZyBmaWVsZFZhbHVlID0gZW5jb2RlQWRkcmVzc2VzKG1haWxib3hlcyk7CisgICAgICAgIHJldHVybiBwYXJzZShNYWlsYm94TGlzdEZpZWxkLlBBUlNFUiwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBZGRyZXNzTGlzdEZpZWxkIGFkZHJlc3NMaXN0MChTdHJpbmcgZmllbGROYW1lLAorICAgICAgICAgICAgSXRlcmFibGU8QWRkcmVzcz4gYWRkcmVzc2VzKSB7CisgICAgICAgIFN0cmluZyBmaWVsZFZhbHVlID0gZW5jb2RlQWRkcmVzc2VzKGFkZHJlc3Nlcyk7CisgICAgICAgIHJldHVybiBwYXJzZShBZGRyZXNzTGlzdEZpZWxkLlBBUlNFUiwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrVmFsaWRGaWVsZE5hbWUoU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICBpZiAoIUZJRUxEX05BTUVfUEFUVEVSTi5tYXRjaGVyKGZpZWxkTmFtZSkubWF0Y2hlcygpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmaWVsZCBuYW1lIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIGlmIChtaW1lVHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGludCBpZHggPSBtaW1lVHlwZS5pbmRleE9mKCcvJyk7CisgICAgICAgIGlmIChpZHggPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBtaW1lVHlwZS5zdWJzdHJpbmcoMCwgaWR4KTsKKyAgICAgICAgU3RyaW5nIHN1YlR5cGUgPSBtaW1lVHlwZS5zdWJzdHJpbmcoaWR4ICsgMSk7CisgICAgICAgIHJldHVybiBFbmNvZGVyVXRpbC5pc1Rva2VuKHR5cGUpICYmIEVuY29kZXJVdGlsLmlzVG9rZW4oc3ViVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkRGlzcG9zaXRpb25UeXBlKFN0cmluZyBkaXNwb3NpdGlvblR5cGUpIHsKKyAgICAgICAgaWYgKGRpc3Bvc2l0aW9uVHlwZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiBFbmNvZGVyVXRpbC5pc1Rva2VuKGRpc3Bvc2l0aW9uVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPEYgZXh0ZW5kcyBGaWVsZD4gRiBwYXJzZShGaWVsZFBhcnNlciBwYXJzZXIsCisgICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgZmllbGRCb2R5KSB7CisgICAgICAgIFN0cmluZyByYXdTdHIgPSBNaW1lVXRpbC5mb2xkKGZpZWxkTmFtZSArICI6ICIgKyBmaWVsZEJvZHksIDApOworICAgICAgICBCeXRlU2VxdWVuY2UgcmF3ID0gQ29udGVudFV0aWwuZW5jb2RlKHJhd1N0cik7CisKKyAgICAgICAgRmllbGQgZmllbGQgPSBwYXJzZXIucGFyc2UoZmllbGROYW1lLCBmaWVsZEJvZHksIHJhdyk7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEYgZiA9IChGKSBmaWVsZDsKKyAgICAgICAgcmV0dXJuIGY7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZUFkZHJlc3NlcyhJdGVyYWJsZTw/IGV4dGVuZHMgQWRkcmVzcz4gYWRkcmVzc2VzKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGZvciAoQWRkcmVzcyBhZGRyZXNzIDogYWRkcmVzc2VzKSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKGFkZHJlc3MuZ2V0RW5jb2RlZFN0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9NYWlsYm94RmllbGQuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvTWFpbGJveEZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFkMzhlYgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvTWFpbGJveEZpZWxkLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5BZGRyZXNzTGlzdDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5NYWlsYm94Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLk1haWxib3hMaXN0Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLnBhcnNlci5QYXJzZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5CeXRlU2VxdWVuY2U7DQorDQorLyoqDQorICogTWFpbGJveCBmaWVsZCBzdWNoIGFzIDxjb2RlPlNlbmRlcjwvY29kZT4gb3IgPGNvZGU+UmVzZW50LVNlbmRlcjwvY29kZT4uDQorICovDQorcHVibGljIGNsYXNzIE1haWxib3hGaWVsZCBleHRlbmRzIEFic3RyYWN0RmllbGQgew0KKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWFpbGJveEZpZWxkLmNsYXNzKTsNCisNCisgICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlZCA9IGZhbHNlOw0KKw0KKyAgICBwcml2YXRlIE1haWxib3ggbWFpbGJveDsNCisgICAgcHJpdmF0ZSBQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbjsNCisNCisgICAgTWFpbGJveEZpZWxkKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgYm9keSwgZmluYWwgQnl0ZVNlcXVlbmNlIHJhdykgew0KKyAgICAgICAgc3VwZXIobmFtZSwgYm9keSwgcmF3KTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgTWFpbGJveCBnZXRNYWlsYm94KCkgew0KKyAgICAgICAgaWYgKCFwYXJzZWQpDQorICAgICAgICAgICAgcGFyc2UoKTsNCisNCisgICAgICAgIHJldHVybiBtYWlsYm94Ow0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2V0UGFyc2VFeGNlcHRpb24oKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIHBhcnNlRXhjZXB0aW9uOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBwYXJzZSgpIHsNCisgICAgICAgIFN0cmluZyBib2R5ID0gZ2V0Qm9keSgpOw0KKw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBNYWlsYm94TGlzdCBtYWlsYm94TGlzdCA9IEFkZHJlc3NMaXN0LnBhcnNlKGJvZHkpLmZsYXR0ZW4oKTsNCisgICAgICAgICAgICBpZiAobWFpbGJveExpc3Quc2l6ZSgpID4gMCkgew0KKyAgICAgICAgICAgICAgICBtYWlsYm94ID0gbWFpbGJveExpc3QuZ2V0KDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJQYXJzaW5nIHZhbHVlICciICsgYm9keSArICInOiAiICsgZS5nZXRNZXNzYWdlKCkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBwYXJzZUV4Y2VwdGlvbiA9IGU7DQorICAgICAgICB9DQorDQorICAgICAgICBwYXJzZWQgPSB0cnVlOw0KKyAgICB9DQorDQorICAgIHN0YXRpYyBmaW5hbCBGaWVsZFBhcnNlciBQQVJTRVIgPSBuZXcgRmllbGRQYXJzZXIoKSB7DQorICAgICAgICBwdWJsaWMgUGFyc2VkRmllbGQgcGFyc2UoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBib2R5LA0KKyAgICAgICAgICAgICAgICBmaW5hbCBCeXRlU2VxdWVuY2UgcmF3KSB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNYWlsYm94RmllbGQobmFtZSwgYm9keSwgcmF3KTsNCisgICAgICAgIH0NCisgICAgfTsNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9NYWlsYm94TGlzdEZpZWxkLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL01haWxib3hMaXN0RmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzExZWMzCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9NYWlsYm94TGlzdEZpZWxkLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5BZGRyZXNzTGlzdDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5NYWlsYm94TGlzdDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuUGFyc2VFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOw0KKw0KKy8qKg0KKyAqIE1haWxib3gtbGlzdCBmaWVsZCBzdWNoIGFzIDxjb2RlPkZyb208L2NvZGU+IG9yIDxjb2RlPlJlc2VudC1Gcm9tPC9jb2RlPi4NCisgKi8NCitwdWJsaWMgY2xhc3MgTWFpbGJveExpc3RGaWVsZCBleHRlbmRzIEFic3RyYWN0RmllbGQgew0KKyAgICBwcml2YXRlIHN0YXRpYyBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coTWFpbGJveExpc3RGaWVsZC5jbGFzcyk7DQorDQorICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZWQgPSBmYWxzZTsNCisNCisgICAgcHJpdmF0ZSBNYWlsYm94TGlzdCBtYWlsYm94TGlzdDsNCisgICAgcHJpdmF0ZSBQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbjsNCisNCisgICAgTWFpbGJveExpc3RGaWVsZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGJvZHksIGZpbmFsIEJ5dGVTZXF1ZW5jZSByYXcpIHsNCisgICAgICAgIHN1cGVyKG5hbWUsIGJvZHksIHJhdyk7DQorICAgIH0NCisNCisgICAgcHVibGljIE1haWxib3hMaXN0IGdldE1haWxib3hMaXN0KCkgew0KKyAgICAgICAgaWYgKCFwYXJzZWQpDQorICAgICAgICAgICAgcGFyc2UoKTsNCisNCisgICAgICAgIHJldHVybiBtYWlsYm94TGlzdDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdldFBhcnNlRXhjZXB0aW9uKCkgew0KKyAgICAgICAgaWYgKCFwYXJzZWQpDQorICAgICAgICAgICAgcGFyc2UoKTsNCisNCisgICAgICAgIHJldHVybiBwYXJzZUV4Y2VwdGlvbjsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgcGFyc2UoKSB7DQorICAgICAgICBTdHJpbmcgYm9keSA9IGdldEJvZHkoKTsNCisNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgbWFpbGJveExpc3QgPSBBZGRyZXNzTGlzdC5wYXJzZShib2R5KS5mbGF0dGVuKCk7DQorICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7DQorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUGFyc2luZyB2YWx1ZSAnIiArIGJvZHkgKyAiJzogIiArIGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgcGFyc2VFeGNlcHRpb24gPSBlOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcGFyc2VkID0gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgICBzdGF0aWMgZmluYWwgRmllbGRQYXJzZXIgUEFSU0VSID0gbmV3IEZpZWxkUGFyc2VyKCkgew0KKyAgICAgICAgcHVibGljIFBhcnNlZEZpZWxkIHBhcnNlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgYm9keSwNCisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVNlcXVlbmNlIHJhdykgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFpbGJveExpc3RGaWVsZChuYW1lLCBib2R5LCByYXcpOw0KKyAgICAgICAgfQ0KKyAgICB9Ow0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL1BhcnNlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MTVkZAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBwYXJzZSBlcnJvcnMgYXJlIGVuY291bnRlcmVkLgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBNaW1lRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBwYXJzZSBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbCBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtZXNzYWdlCisgICAgICogICAgICAgICAgICBkZXRhaWwgbWVzc2FnZQorICAgICAqLworICAgIHByb3RlY3RlZCBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhcnNlIGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGFyc2VFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhcnNlIGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIG1lc3NhZ2UgYW5kCisgICAgICogY2F1c2UuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIGRldGFpbCBtZXNzYWdlCisgICAgICogQHBhcmFtIGNhdXNlCisgICAgICogICAgICAgICAgICB0aGUgY2F1c2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL1BhcnNlZEZpZWxkLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL1BhcnNlZEZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4MTU3MQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvUGFyc2VkRmllbGQuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkZpZWxkOworCitwdWJsaWMgaW50ZXJmYWNlIFBhcnNlZEZpZWxkIGV4dGVuZHMgRmllbGQgeworCisgICAgLyoqCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCBpLmUuIG5vIGVycm9ycyB3ZXJlCisgICAgICogZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZyB0aGUgZmllbGQgdmFsdWUuCisgICAgICogCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZpZWxkIGlzIHZhbGlkLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNnZXRQYXJzZUV4Y2VwdGlvbigpCisgICAgICovCisgICAgYm9vbGVhbiBpc1ZhbGlkRmllbGQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24gYnkgdGhlIGZpZWxkIHBhcnNlciB3aGlsZSBwYXJzaW5nCisgICAgICogdGhlIGZpZWxkIHZhbHVlLiBUaGUgcmVzdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmaWVsZCBpcyB2YWxpZAorICAgICAqIGFuZCBubyBlcnJvcnMgd2VyZSBlbmNvdW50ZXJlZC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gdGhhdCB3YXMgdGhyb3duIGJ5IHRoZSBmaWVsZCBwYXJzZXIgb3IKKyAgICAgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBmaWVsZCBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICBQYXJzZUV4Y2VwdGlvbiBnZXRQYXJzZUV4Y2VwdGlvbigpOworCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL1Vuc3RydWN0dXJlZEZpZWxkLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL1Vuc3RydWN0dXJlZEZpZWxkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxNDhmZgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvVW5zdHJ1Y3R1cmVkRmllbGQuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWMuRGVjb2RlclV0aWw7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOw0KKw0KKy8qKg0KKyAqIFNpbXBsZSB1bnN0cnVjdHVyZWQgZmllbGQgc3VjaCBhcyA8Y29kZT5TdWJqZWN0PC9jb2RlPi4NCisgKi8NCitwdWJsaWMgY2xhc3MgVW5zdHJ1Y3R1cmVkRmllbGQgZXh0ZW5kcyBBYnN0cmFjdEZpZWxkIHsNCisgICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlZCA9IGZhbHNlOw0KKw0KKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsNCisNCisgICAgVW5zdHJ1Y3R1cmVkRmllbGQoU3RyaW5nIG5hbWUsIFN0cmluZyBib2R5LCBCeXRlU2VxdWVuY2UgcmF3KSB7DQorICAgICAgICBzdXBlcihuYW1lLCBib2R5LCByYXcpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7DQorICAgICAgICBpZiAoIXBhcnNlZCkNCisgICAgICAgICAgICBwYXJzZSgpOw0KKw0KKyAgICAgICAgcmV0dXJuIHZhbHVlOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBwYXJzZSgpIHsNCisgICAgICAgIFN0cmluZyBib2R5ID0gZ2V0Qm9keSgpOw0KKw0KKyAgICAgICAgdmFsdWUgPSBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMoYm9keSk7DQorDQorICAgICAgICBwYXJzZWQgPSB0cnVlOw0KKyAgICB9DQorDQorICAgIHN0YXRpYyBmaW5hbCBGaWVsZFBhcnNlciBQQVJTRVIgPSBuZXcgRmllbGRQYXJzZXIoKSB7DQorICAgICAgICBwdWJsaWMgUGFyc2VkRmllbGQgcGFyc2UoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBib2R5LA0KKyAgICAgICAgICAgICAgICBmaW5hbCBCeXRlU2VxdWVuY2UgcmF3KSB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBVbnN0cnVjdHVyZWRGaWVsZChuYW1lLCBib2R5LCByYXcpOw0KKyAgICAgICAgfQ0KKyAgICB9Ow0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvQWRkcmVzcy5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0FkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2FhM2NjCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0FkZHJlc3MuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzczsNCisNCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQoraW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuQWRkcmVzc0xpc3RQYXJzZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLlBhcnNlRXhjZXB0aW9uOw0KKw0KKy8qKg0KKyAqIFRoZSBhYnN0cmFjdCBiYXNlIGZvciBjbGFzc2VzIHRoYXQgcmVwcmVzZW50IFJGQzI4MjIgYWRkcmVzc2VzLiBUaGlzIGluY2x1ZGVzDQorICogZ3JvdXBzIGFuZCBtYWlsYm94ZXMuDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZHJlc3MgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgew0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA2MzQwOTA2NjE5OTA0MzM0MjZMOw0KKw0KKyAgICAvKioNCisgICAgICogQWRkcyBhbnkgbWFpbGJveGVzIHJlcHJlc2VudGVkIGJ5IHRoaXMgYWRkcmVzcyBpbnRvIHRoZSBnaXZlbiBMaXN0LiBOb3RlDQorICAgICAqIHRoYXQgdGhpcyBtZXRob2QgaGFzIGRlZmF1bHQgKHBhY2thZ2UpIGFjY2Vzcywgc28gYSBkb0FkZE1haWxib3hlc1RvDQorICAgICAqIG1ldGhvZCBpcyBuZWVkZWQgdG8gYWxsb3cgdGhlIGJlaGF2aW9yIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4NCisgICAgICovDQorICAgIGZpbmFsIHZvaWQgYWRkTWFpbGJveGVzVG8oTGlzdDxNYWlsYm94PiByZXN1bHRzKSB7DQorICAgICAgICBkb0FkZE1haWxib3hlc1RvKHJlc3VsdHMpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBBZGRzIGFueSBtYWlsYm94ZXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBhZGRyZXNzIGludG8gdGhlIGdpdmVuIExpc3QuIE11c3QNCisgICAgICogYmUgb3ZlcnJpZGRlbiBieSBjb25jcmV0ZSBzdWJjbGFzc2VzLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9BZGRNYWlsYm94ZXNUbyhMaXN0PE1haWxib3g+IHJlc3VsdHMpOw0KKw0KKyAgICAvKioNCisgICAgICogRm9ybWF0cyB0aGUgYWRkcmVzcyBhcyBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZywgbm90IGluY2x1ZGluZyB0aGUgcm91dGUuDQorICAgICAqIFRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGludGVuZGVkIGZvciBkaXNwbGF5IHB1cnBvc2VzIG9ubHkgYW5kIGNhbm5vdCBiZQ0KKyAgICAgKiB1c2VkIGZvciB0cmFuc3BvcnQgcHVycG9zZXMuDQorICAgICAqIA0KKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYWRkcmVzcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQNCisgICAgICogQHNlZSAjZ2V0RGlzcGxheVN0cmluZyhib29sZWFuKQ0KKyAgICAgKi8NCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgew0KKyAgICAgICAgcmV0dXJuIGdldERpc3BsYXlTdHJpbmcoZmFsc2UpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGb3JtYXRzIHRoZSBhZGRyZXNzIGFzIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nLCBub3QgaW5jbHVkaW5nIHRoZSByb3V0ZS4NCisgICAgICogVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgaW50ZW5kZWQgZm9yIGRpc3BsYXkgcHVycG9zZXMgb25seSBhbmQgY2Fubm90IGJlDQorICAgICAqIHVzZWQgZm9yIHRyYW5zcG9ydCBwdXJwb3Nlcy4NCisgICAgICogDQorICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgdW5wYXJzZWQgYWRkcmVzcyB3YXMNCisgICAgICogDQorICAgICAqIDwiSm9lIENoZW5nIkBqb2VjaGVuZy5jb20+DQorICAgICAqIA0KKyAgICAgKiB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4NCisgICAgICogDQorICAgICAqIDxKb2UgQ2hlbmdAam9lY2hlbmcuY29tPg0KKyAgICAgKiANCisgICAgICogd2hpY2ggaXMgbm90IHZhbGlkIGZvciB0cmFuc3BvcnQ7IHRoZSBsb2NhbCBwYXJ0IHdvdWxkIG5lZWQgdG8gYmUNCisgICAgICogcmUtcXVvdGVkLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGluY2x1ZGVSb3V0ZQ0KKyAgICAgKiAgICAgICAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaWYgaXQNCisgICAgICogICAgICAgICAgICBleGlzdHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBhZGRyZXNzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZC4NCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZyhib29sZWFuIGluY2x1ZGVSb3V0ZSk7DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYWRkcmVzcyB0aGF0IGNhbiBiZSB1c2VkIGZvcg0KKyAgICAgKiB0cmFuc3BvcnQgcHVycG9zZXMuIFRoZSByb3V0ZSBpcyBuZXZlciBpbmNsdWRlZCBpbiB0aGlzIHJlcHJlc2VudGF0aW9uDQorICAgICAqIGJlY2F1c2Ugcm91dGVzIGFyZSBvYnNvbGV0ZSBhbmQgUkZDIDUzMjIgc3RhdGVzIHRoYXQgb2Jzb2xldGUgc3ludGFjdGljDQorICAgICAqIGZvcm1zIE1VU1QgTk9UIGJlIGdlbmVyYXRlZC4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBhZGRyZXNzIGludGVuZGVkIGZvciB0cmFuc3BvcnQNCisgICAgICogICAgICAgICBwdXJwb3Nlcy4NCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RW5jb2RlZFN0cmluZygpOw0KKw0KKyAgICAvKioNCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgcmF3IHN0cmluZyBpbnRvIGFuIGFkZHJlc3MuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcmF3QWRkcmVzc1N0cmluZw0KKyAgICAgKiAgICAgICAgICAgIHN0cmluZyB0byBwYXJzZS4NCisgICAgICogQHJldHVybiBhbiA8Y29kZT5BZGRyZXNzPC9jb2RlPiBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgc3RyaW5nLg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmF3IHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYSBzaW5nbGUgYWRkcmVzcy4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgQWRkcmVzcyBwYXJzZShTdHJpbmcgcmF3QWRkcmVzc1N0cmluZykgew0KKyAgICAgICAgQWRkcmVzc0xpc3RQYXJzZXIgcGFyc2VyID0gbmV3IEFkZHJlc3NMaXN0UGFyc2VyKG5ldyBTdHJpbmdSZWFkZXIoDQorICAgICAgICAgICAgICAgIHJhd0FkZHJlc3NTdHJpbmcpKTsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmV0dXJuIEJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5idWlsZEFkZHJlc3MocGFyc2VyLnBhcnNlQWRkcmVzcygpKTsNCisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgcmV0dXJuIGdldERpc3BsYXlTdHJpbmcoZmFsc2UpOw0KKyAgICB9DQorDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvYWRkcmVzcy9BZGRyZXNzTGlzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0FkZHJlc3NMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVhYmEzYgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvYWRkcmVzcy9BZGRyZXNzTGlzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLnBhcnNlci5BZGRyZXNzTGlzdFBhcnNlcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuUGFyc2VFeGNlcHRpb247DQorDQoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCisvKioNCisgKiBBbiBpbW11dGFibGUsIHJhbmRvbS1hY2Nlc3MgbGlzdCBvZiBBZGRyZXNzIG9iamVjdHMuDQorICovDQorcHVibGljIGNsYXNzIEFkZHJlc3NMaXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0PEFkZHJlc3M+IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQorDQorICAgIHByaXZhdGUgZmluYWwgTGlzdDw/IGV4dGVuZHMgQWRkcmVzcz4gYWRkcmVzc2VzOw0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIGFkZHJlc3Nlcw0KKyAgICAgKiAgICAgICAgICAgIEEgTGlzdCB0aGF0IGNvbnRhaW5zIG9ubHkgQWRkcmVzcyBvYmplY3RzLg0KKyAgICAgKiBAcGFyYW0gZG9udENvcHkNCisgICAgICogICAgICAgICAgICB0cnVlIGlmZiBpdCBpcyBub3QgcG9zc2libGUgZm9yIHRoZSBhZGRyZXNzZXMgbGlzdCB0byBiZQ0KKyAgICAgKiAgICAgICAgICAgIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZS4NCisgICAgICovDQorICAgIHB1YmxpYyBBZGRyZXNzTGlzdChMaXN0PD8gZXh0ZW5kcyBBZGRyZXNzPiBhZGRyZXNzZXMsIGJvb2xlYW4gZG9udENvcHkpIHsNCisgICAgICAgIGlmIChhZGRyZXNzZXMgIT0gbnVsbCkNCisgICAgICAgICAgICB0aGlzLmFkZHJlc3NlcyA9IGRvbnRDb3B5ID8gYWRkcmVzc2VzIDogbmV3IEFycmF5TGlzdDxBZGRyZXNzPigNCisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Nlcyk7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgdGhpcy5hZGRyZXNzZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGxpc3QuDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBzaXplKCkgew0KKyAgICAgICAgcmV0dXJuIGFkZHJlc3Nlcy5zaXplKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEdldHMgYW4gYWRkcmVzcy4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgQWRkcmVzcyBnZXQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gYWRkcmVzc2VzLmdldChpbmRleCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSBmbGF0IGxpc3Qgb2YgYWxsIG1haWxib3hlcyByZXByZXNlbnRlZCBpbiB0aGlzIGFkZHJlc3MgbGlzdC4NCisgICAgICogVXNlIHRoaXMgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgZ3JvdXBpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgTWFpbGJveExpc3QgZmxhdHRlbigpIHsNCisgICAgICAgIC8vIGluIHRoZSBjb21tb24gY2FzZSwgYWxsIGFkZHJlc3NlcyBhcmUgbWFpbGJveGVzDQorICAgICAgICBib29sZWFuIGdyb3VwRGV0ZWN0ZWQgPSBmYWxzZTsNCisgICAgICAgIGZvciAoQWRkcmVzcyBhZGRyIDogYWRkcmVzc2VzKSB7DQorICAgICAgICAgICAgaWYgKCEoYWRkciBpbnN0YW5jZW9mIE1haWxib3gpKSB7DQorICAgICAgICAgICAgICAgIGdyb3VwRGV0ZWN0ZWQgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoIWdyb3VwRGV0ZWN0ZWQpIHsNCisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisgICAgICAgICAgICBmaW5hbCBMaXN0PE1haWxib3g+IG1haWxib3hlcyA9IChMaXN0PE1haWxib3g+KSBhZGRyZXNzZXM7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNYWlsYm94TGlzdChtYWlsYm94ZXMsIHRydWUpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgTGlzdDxNYWlsYm94PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxNYWlsYm94PigpOw0KKyAgICAgICAgZm9yIChBZGRyZXNzIGFkZHIgOiBhZGRyZXNzZXMpIHsNCisgICAgICAgICAgICBhZGRyLmFkZE1haWxib3hlc1RvKHJlc3VsdHMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgLy8gY29weS1vbi1jb25zdHJ1Y3QgdGhpcyB0aW1lLCBiZWNhdXNlIHN1YmNsYXNzZXMNCisgICAgICAgIC8vIGNvdWxkIGhhdmUgaGVsZCBvbnRvIGEgcmVmZXJlbmNlIHRvIHRoZSByZXN1bHRzDQorICAgICAgICByZXR1cm4gbmV3IE1haWxib3hMaXN0KHJlc3VsdHMsIGZhbHNlKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRHVtcHMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFkZHJlc3MgbGlzdCB0byBzdGRvdXQsIGZvciBkZWJ1Z2dpbmcNCisgICAgICogcHVycG9zZXMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBwcmludCgpIHsNCisgICAgICAgIGZvciAoQWRkcmVzcyBhZGRyIDogYWRkcmVzc2VzKSB7DQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGFkZHIudG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFBhcnNlIHRoZSBhZGRyZXNzIGxpc3Qgc3RyaW5nLCBzdWNoIGFzIHRoZSB2YWx1ZSBvZiBhIEZyb20sIFRvLCBDYywgQmNjLA0KKyAgICAgKiBTZW5kZXIsIG9yIFJlcGx5LVRvIGhlYWRlci4NCisgICAgICogDQorICAgICAqIFRoZSBzdHJpbmcgTVVTVCBiZSB1bmZvbGRlZCBhbHJlYWR5Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBBZGRyZXNzTGlzdCBwYXJzZShTdHJpbmcgcmF3QWRkcmVzc0xpc3QpDQorICAgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsNCisgICAgICAgIEFkZHJlc3NMaXN0UGFyc2VyIHBhcnNlciA9IG5ldyBBZGRyZXNzTGlzdFBhcnNlcihuZXcgU3RyaW5nUmVhZGVyKA0KKyAgICAgICAgICAgICAgICByYXdBZGRyZXNzTGlzdCkpOw0KKyAgICAgICAgcmV0dXJuIEJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5idWlsZEFkZHJlc3NMaXN0KHBhcnNlci5wYXJzZUFkZHJlc3NMaXN0KCkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUZXN0IGNvbnNvbGUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIGphdmEuaW8uQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uQnVmZmVyZWRSZWFkZXIoDQorICAgICAgICAgICAgICAgIG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKFN5c3RlbS5pbikpOw0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsNCisgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCI+ICIpOw0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOw0KKyAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwIHx8IGxpbmUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImV4aXQiKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxpbmUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInF1aXQiKSkgew0KKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb29kYnllLiIpOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIEFkZHJlc3NMaXN0IGxpc3QgPSBwYXJzZShsaW5lKTsNCisgICAgICAgICAgICAgICAgbGlzdC5wcmludCgpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7DQorICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgzMDApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvQnVpbGRlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM0MDcxCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0J1aWxkZXIuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzczsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWMuRGVjb2RlclV0aWw7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLkFTVGFkZHJfc3BlYzsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuQVNUYWRkcmVzczsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuQVNUYWRkcmVzc19saXN0Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLnBhcnNlci5BU1RhbmdsZV9hZGRyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLnBhcnNlci5BU1Rkb21haW47DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLkFTVGdyb3VwX2JvZHk7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLkFTVGxvY2FsX3BhcnQ7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLkFTVG1haWxib3g7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLkFTVG5hbWVfYWRkcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuQVNUcGhyYXNlOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLnBhcnNlci5BU1Ryb3V0ZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuTm9kZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuU2ltcGxlTm9kZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuVG9rZW47DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQorLyoqDQorICogVHJhbnNmb3JtcyB0aGUgSkpUcmVlLWdlbmVyYXRlZCBhYnN0cmFjdCBzeW50YXggdHJlZSBpbnRvIGEgZ3JhcGggb2YNCisgKiBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzIG9iamVjdHMuDQorICovDQorY2xhc3MgQnVpbGRlciB7DQorDQorICAgIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgc2luZ2xldG9uID0gbmV3IEJ1aWxkZXIoKTsNCisNCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGdldEluc3RhbmNlKCkgew0KKyAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQWRkcmVzc0xpc3QgYnVpbGRBZGRyZXNzTGlzdChBU1RhZGRyZXNzX2xpc3Qgbm9kZSkgew0KKyAgICAgICAgTGlzdDxBZGRyZXNzPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxBZGRyZXNzPigpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlLmpqdEdldE51bUNoaWxkcmVuKCk7IGkrKykgew0KKyAgICAgICAgICAgIEFTVGFkZHJlc3MgY2hpbGROb2RlID0gKEFTVGFkZHJlc3MpIG5vZGUuamp0R2V0Q2hpbGQoaSk7DQorICAgICAgICAgICAgQWRkcmVzcyBhZGRyZXNzID0gYnVpbGRBZGRyZXNzKGNoaWxkTm9kZSk7DQorICAgICAgICAgICAgbGlzdC5hZGQoYWRkcmVzcyk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbmV3IEFkZHJlc3NMaXN0KGxpc3QsIHRydWUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBBZGRyZXNzIGJ1aWxkQWRkcmVzcyhBU1RhZGRyZXNzIG5vZGUpIHsNCisgICAgICAgIENoaWxkTm9kZUl0ZXJhdG9yIGl0ID0gbmV3IENoaWxkTm9kZUl0ZXJhdG9yKG5vZGUpOw0KKyAgICAgICAgTm9kZSBuID0gaXQubmV4dCgpOw0KKyAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBBU1RhZGRyX3NwZWMpIHsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRBZGRyU3BlYygoQVNUYWRkcl9zcGVjKSBuKTsNCisgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIEFTVGFuZ2xlX2FkZHIpIHsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRBbmdsZUFkZHIoKEFTVGFuZ2xlX2FkZHIpIG4pOw0KKyAgICAgICAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgQVNUcGhyYXNlKSB7DQorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBidWlsZFN0cmluZygoQVNUcGhyYXNlKSBuLCBmYWxzZSk7DQorICAgICAgICAgICAgTm9kZSBuMiA9IGl0Lm5leHQoKTsNCisgICAgICAgICAgICBpZiAobjIgaW5zdGFuY2VvZiBBU1Rncm91cF9ib2R5KSB7DQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR3JvdXAobmFtZSwgYnVpbGRHcm91cEJvZHkoKEFTVGdyb3VwX2JvZHkpIG4yKSk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChuMiBpbnN0YW5jZW9mIEFTVGFuZ2xlX2FkZHIpIHsNCisgICAgICAgICAgICAgICAgbmFtZSA9IERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcyhuYW1lKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYWlsYm94KG5hbWUsIGJ1aWxkQW5nbGVBZGRyKChBU1RhbmdsZV9hZGRyKSBuMikpOw0KKyAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIE1haWxib3hMaXN0IGJ1aWxkR3JvdXBCb2R5KEFTVGdyb3VwX2JvZHkgbm9kZSkgew0KKyAgICAgICAgTGlzdDxNYWlsYm94PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxNYWlsYm94PigpOw0KKyAgICAgICAgQ2hpbGROb2RlSXRlcmF0b3IgaXQgPSBuZXcgQ2hpbGROb2RlSXRlcmF0b3Iobm9kZSk7DQorICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7DQorICAgICAgICAgICAgTm9kZSBuID0gaXQubmV4dCgpOw0KKyAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgQVNUbWFpbGJveCkNCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoYnVpbGRNYWlsYm94KChBU1RtYWlsYm94KSBuKSk7DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbmV3IE1haWxib3hMaXN0KHJlc3VsdHMsIHRydWUpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBNYWlsYm94IGJ1aWxkTWFpbGJveChBU1RtYWlsYm94IG5vZGUpIHsNCisgICAgICAgIENoaWxkTm9kZUl0ZXJhdG9yIGl0ID0gbmV3IENoaWxkTm9kZUl0ZXJhdG9yKG5vZGUpOw0KKyAgICAgICAgTm9kZSBuID0gaXQubmV4dCgpOw0KKyAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBBU1RhZGRyX3NwZWMpIHsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRBZGRyU3BlYygoQVNUYWRkcl9zcGVjKSBuKTsNCisgICAgICAgIH0gZWxzZSBpZiAobiBpbnN0YW5jZW9mIEFTVGFuZ2xlX2FkZHIpIHsNCisgICAgICAgICAgICByZXR1cm4gYnVpbGRBbmdsZUFkZHIoKEFTVGFuZ2xlX2FkZHIpIG4pOw0KKyAgICAgICAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgQVNUbmFtZV9hZGRyKSB7DQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTmFtZUFkZHIoKEFTVG5hbWVfYWRkcikgbik7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIE1haWxib3ggYnVpbGROYW1lQWRkcihBU1RuYW1lX2FkZHIgbm9kZSkgew0KKyAgICAgICAgQ2hpbGROb2RlSXRlcmF0b3IgaXQgPSBuZXcgQ2hpbGROb2RlSXRlcmF0b3Iobm9kZSk7DQorICAgICAgICBOb2RlIG4gPSBpdC5uZXh0KCk7DQorICAgICAgICBTdHJpbmcgbmFtZTsNCisgICAgICAgIGlmIChuIGluc3RhbmNlb2YgQVNUcGhyYXNlKSB7DQorICAgICAgICAgICAgbmFtZSA9IGJ1aWxkU3RyaW5nKChBU1RwaHJhc2UpIG4sIGZhbHNlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbiA9IGl0Lm5leHQoKTsNCisgICAgICAgIGlmIChuIGluc3RhbmNlb2YgQVNUYW5nbGVfYWRkcikgew0KKyAgICAgICAgICAgIG5hbWUgPSBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMobmFtZSk7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNYWlsYm94KG5hbWUsIGJ1aWxkQW5nbGVBZGRyKChBU1RhbmdsZV9hZGRyKSBuKSk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIE1haWxib3ggYnVpbGRBbmdsZUFkZHIoQVNUYW5nbGVfYWRkciBub2RlKSB7DQorICAgICAgICBDaGlsZE5vZGVJdGVyYXRvciBpdCA9IG5ldyBDaGlsZE5vZGVJdGVyYXRvcihub2RlKTsNCisgICAgICAgIERvbWFpbkxpc3Qgcm91dGUgPSBudWxsOw0KKyAgICAgICAgTm9kZSBuID0gaXQubmV4dCgpOw0KKyAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBBU1Ryb3V0ZSkgew0KKyAgICAgICAgICAgIHJvdXRlID0gYnVpbGRSb3V0ZSgoQVNUcm91dGUpIG4pOw0KKyAgICAgICAgICAgIG4gPSBpdC5uZXh0KCk7DQorICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBBU1RhZGRyX3NwZWMpIHsNCisgICAgICAgICAgICAvLyBkbyBub3RoaW5nDQorICAgICAgICB9DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOw0KKw0KKyAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBBU1RhZGRyX3NwZWMpDQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkQWRkclNwZWMocm91dGUsIChBU1RhZGRyX3NwZWMpIG4pOw0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIERvbWFpbkxpc3QgYnVpbGRSb3V0ZShBU1Ryb3V0ZSBub2RlKSB7DQorICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihub2RlLmpqdEdldE51bUNoaWxkcmVuKCkpOw0KKyAgICAgICAgQ2hpbGROb2RlSXRlcmF0b3IgaXQgPSBuZXcgQ2hpbGROb2RlSXRlcmF0b3Iobm9kZSk7DQorICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7DQorICAgICAgICAgICAgTm9kZSBuID0gaXQubmV4dCgpOw0KKyAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgQVNUZG9tYWluKQ0KKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChidWlsZFN0cmluZygoQVNUZG9tYWluKSBuLCB0cnVlKSk7DQorICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gbmV3IERvbWFpbkxpc3QocmVzdWx0cywgdHJ1ZSk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBNYWlsYm94IGJ1aWxkQWRkclNwZWMoQVNUYWRkcl9zcGVjIG5vZGUpIHsNCisgICAgICAgIHJldHVybiBidWlsZEFkZHJTcGVjKG51bGwsIG5vZGUpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgTWFpbGJveCBidWlsZEFkZHJTcGVjKERvbWFpbkxpc3Qgcm91dGUsIEFTVGFkZHJfc3BlYyBub2RlKSB7DQorICAgICAgICBDaGlsZE5vZGVJdGVyYXRvciBpdCA9IG5ldyBDaGlsZE5vZGVJdGVyYXRvcihub2RlKTsNCisgICAgICAgIFN0cmluZyBsb2NhbFBhcnQgPSBidWlsZFN0cmluZygoQVNUbG9jYWxfcGFydCkgaXQubmV4dCgpLCB0cnVlKTsNCisgICAgICAgIFN0cmluZyBkb21haW4gPSBidWlsZFN0cmluZygoQVNUZG9tYWluKSBpdC5uZXh0KCksIHRydWUpOw0KKyAgICAgICAgcmV0dXJuIG5ldyBNYWlsYm94KHJvdXRlLCBsb2NhbFBhcnQsIGRvbWFpbik7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgYnVpbGRTdHJpbmcoU2ltcGxlTm9kZSBub2RlLCBib29sZWFuIHN0cmlwU3BhY2VzKSB7DQorICAgICAgICBUb2tlbiBoZWFkID0gbm9kZS5maXJzdFRva2VuOw0KKyAgICAgICAgVG9rZW4gdGFpbCA9IG5vZGUubGFzdFRva2VuOw0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBvdXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KKw0KKyAgICAgICAgd2hpbGUgKGhlYWQgIT0gdGFpbCkgew0KKyAgICAgICAgICAgIG91dC5hcHBlbmQoaGVhZC5pbWFnZSk7DQorICAgICAgICAgICAgaGVhZCA9IGhlYWQubmV4dDsNCisgICAgICAgICAgICBpZiAoIXN0cmlwU3BhY2VzKQ0KKyAgICAgICAgICAgICAgICBhZGRTcGVjaWFscyhvdXQsIGhlYWQuc3BlY2lhbFRva2VuKTsNCisgICAgICAgIH0NCisgICAgICAgIG91dC5hcHBlbmQodGFpbC5pbWFnZSk7DQorDQorICAgICAgICByZXR1cm4gb3V0LnRvU3RyaW5nKCk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSB2b2lkIGFkZFNwZWNpYWxzKFN0cmluZ0J1aWxkZXIgb3V0LCBUb2tlbiBzcGVjaWFsVG9rZW4pIHsNCisgICAgICAgIGlmIChzcGVjaWFsVG9rZW4gIT0gbnVsbCkgew0KKyAgICAgICAgICAgIGFkZFNwZWNpYWxzKG91dCwgc3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbik7DQorICAgICAgICAgICAgb3V0LmFwcGVuZChzcGVjaWFsVG9rZW4uaW1hZ2UpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoaWxkTm9kZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8Tm9kZT4gew0KKw0KKyAgICAgICAgcHJpdmF0ZSBTaW1wbGVOb2RlIHNpbXBsZU5vZGU7DQorICAgICAgICBwcml2YXRlIGludCBpbmRleDsNCisgICAgICAgIHByaXZhdGUgaW50IGxlbjsNCisNCisgICAgICAgIHB1YmxpYyBDaGlsZE5vZGVJdGVyYXRvcihTaW1wbGVOb2RlIHNpbXBsZU5vZGUpIHsNCisgICAgICAgICAgICB0aGlzLnNpbXBsZU5vZGUgPSBzaW1wbGVOb2RlOw0KKyAgICAgICAgICAgIHRoaXMubGVuID0gc2ltcGxlTm9kZS5qanRHZXROdW1DaGlsZHJlbigpOw0KKyAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsNCisgICAgICAgICAgICByZXR1cm4gaW5kZXggPCBsZW47DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgTm9kZSBuZXh0KCkgew0KKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVOb2RlLmpqdEdldENoaWxkKGluZGV4KyspOw0KKyAgICAgICAgfQ0KKw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvYWRkcmVzcy9Eb21haW5MaXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvRG9tYWluTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNWQ3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvRG9tYWluTGlzdC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3M7DQorDQoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KKy8qKg0KKyAqIEFuIGltbXV0YWJsZSwgcmFuZG9tLWFjY2VzcyBsaXN0IG9mIFN0cmluZ3MgKHRoYXQgYXJlIHN1cHBvc2VkbHkgZG9tYWluIG5hbWVzDQorICogb3IgZG9tYWluIGxpdGVyYWxzKS4NCisgKi8NCitwdWJsaWMgY2xhc3MgRG9tYWluTGlzdCBleHRlbmRzIEFic3RyYWN0TGlzdDxTdHJpbmc+IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQorDQorICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IGRvbWFpbnM7DQorDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gZG9tYWlucw0KKyAgICAgKiAgICAgICAgICAgIEEgTGlzdCB0aGF0IGNvbnRhaW5zIG9ubHkgU3RyaW5nIG9iamVjdHMuDQorICAgICAqIEBwYXJhbSBkb250Q29weQ0KKyAgICAgKiAgICAgICAgICAgIHRydWUgaWZmIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGRvbWFpbnMgbGlzdCB0byBiZQ0KKyAgICAgKiAgICAgICAgICAgIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZS4NCisgICAgICovDQorICAgIHB1YmxpYyBEb21haW5MaXN0KExpc3Q8U3RyaW5nPiBkb21haW5zLCBib29sZWFuIGRvbnRDb3B5KSB7DQorICAgICAgICBpZiAoZG9tYWlucyAhPSBudWxsKQ0KKyAgICAgICAgICAgIHRoaXMuZG9tYWlucyA9IGRvbnRDb3B5ID8gZG9tYWlucyA6IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihkb21haW5zKTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICB0aGlzLmRvbWFpbnMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGlzIGxpc3QuDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBzaXplKCkgew0KKyAgICAgICAgcmV0dXJuIGRvbWFpbnMuc2l6ZSgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSBkb21haW4gbmFtZSBvciBkb21haW4gbGl0ZXJhbCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Lg0KKyAgICAgKiANCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uDQorICAgICAqICAgICAgICAgICAgIElmIGluZGV4IGlzICZsdDsgMCBvciAmZ3Q7PSBzaXplKCkuDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyBnZXQoaW50IGluZGV4KSB7DQorICAgICAgICByZXR1cm4gZG9tYWlucy5nZXQoaW5kZXgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGRvbWFpbnMgZm9ybWF0dGVkIGFzIGEgcm91dGUgc3RyaW5nIChub3QgaW5jbHVkaW5nDQorICAgICAqIHRoZSB0cmFpbGluZyAnOicpLg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyB0b1JvdXRlU3RyaW5nKCkgew0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorDQorICAgICAgICBmb3IgKFN0cmluZyBkb21haW4gOiBkb21haW5zKSB7DQorICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgew0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgc2IuYXBwZW5kKCJAIik7DQorICAgICAgICAgICAgc2IuYXBwZW5kKGRvbWFpbik7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIHJldHVybiB0b1JvdXRlU3RyaW5nKCk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0dyb3VwLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmI2YWZjCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0dyb3VwLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3M7DQorDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWMuRW5jb2RlclV0aWw7DQorDQorLyoqDQorICogQSBuYW1lZCBncm91cCBvZiB6ZXJvIG9yIG1vcmUgbWFpbGJveGVzLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBHcm91cCBleHRlbmRzIEFkZHJlc3Mgew0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCisgICAgcHJpdmF0ZSBmaW5hbCBNYWlsYm94TGlzdCBtYWlsYm94TGlzdDsNCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBuYW1lDQorICAgICAqICAgICAgICAgICAgVGhlIGdyb3VwIG5hbWUuDQorICAgICAqIEBwYXJhbSBtYWlsYm94ZXMNCisgICAgICogICAgICAgICAgICBUaGUgbWFpbGJveGVzIGluIHRoaXMgZ3JvdXAuDQorICAgICAqLw0KKyAgICBwdWJsaWMgR3JvdXAoU3RyaW5nIG5hbWUsIE1haWxib3guLi4gbWFpbGJveGVzKSB7DQorICAgICAgICB0aGlzKG5hbWUsIG5ldyBNYWlsYm94TGlzdChBcnJheXMuYXNMaXN0KG1haWxib3hlcyksIHRydWUpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG5hbWUNCisgICAgICogICAgICAgICAgICBUaGUgZ3JvdXAgbmFtZS4NCisgICAgICogQHBhcmFtIG1haWxib3hlcw0KKyAgICAgKiAgICAgICAgICAgIFRoZSBtYWlsYm94ZXMgaW4gdGhpcyBncm91cC4NCisgICAgICovDQorICAgIHB1YmxpYyBHcm91cChTdHJpbmcgbmFtZSwgQ29sbGVjdGlvbjxNYWlsYm94PiBtYWlsYm94ZXMpIHsNCisgICAgICAgIHRoaXMobmFtZSwgbmV3IE1haWxib3hMaXN0KG5ldyBBcnJheUxpc3Q8TWFpbGJveD4obWFpbGJveGVzKSwgdHJ1ZSkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcGFyYW0gbmFtZQ0KKyAgICAgKiAgICAgICAgICAgIFRoZSBncm91cCBuYW1lLg0KKyAgICAgKiBAcGFyYW0gbWFpbGJveGVzDQorICAgICAqICAgICAgICAgICAgVGhlIG1haWxib3hlcyBpbiB0aGlzIGdyb3VwLg0KKyAgICAgKi8NCisgICAgcHVibGljIEdyb3VwKFN0cmluZyBuYW1lLCBNYWlsYm94TGlzdCBtYWlsYm94ZXMpIHsNCisgICAgICAgIGlmIChuYW1lID09IG51bGwpDQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOw0KKyAgICAgICAgaWYgKG1haWxib3hlcyA9PSBudWxsKQ0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsNCisNCisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQorICAgICAgICB0aGlzLm1haWxib3hMaXN0ID0gbWFpbGJveGVzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCByYXcgc3RyaW5nIGludG8gYSBncm91cCBhZGRyZXNzLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIHJhd0dyb3VwU3RyaW5nDQorICAgICAqICAgICAgICAgICAgc3RyaW5nIHRvIHBhcnNlLg0KKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBzdHJpbmcuDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uDQorICAgICAqICAgICAgICAgICAgIGlmIHRoZSByYXcgc3RyaW5nIGRvZXMgbm90IHJlcHJlc2VudCBhIHNpbmdsZSBncm91cCBhZGRyZXNzLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBHcm91cCBwYXJzZShTdHJpbmcgcmF3R3JvdXBTdHJpbmcpIHsNCisgICAgICAgIEFkZHJlc3MgYWRkcmVzcyA9IEFkZHJlc3MucGFyc2UocmF3R3JvdXBTdHJpbmcpOw0KKyAgICAgICAgaWYgKCEoYWRkcmVzcyBpbnN0YW5jZW9mIEdyb3VwKSkNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSBncm91cCBhZGRyZXNzIik7DQorDQorICAgICAgICByZXR1cm4gKEdyb3VwKSBhZGRyZXNzOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBncm91cCBuYW1lLg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKyAgICAgICAgcmV0dXJuIG5hbWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIG1haWxib3hlcyBpbiB0aGlzIGdyb3VwLg0KKyAgICAgKi8NCisgICAgcHVibGljIE1haWxib3hMaXN0IGdldE1haWxib3hlcygpIHsNCisgICAgICAgIHJldHVybiBtYWlsYm94TGlzdDsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKGJvb2xlYW4gaW5jbHVkZVJvdXRlKSB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisNCisgICAgICAgIHNiLmFwcGVuZChuYW1lKTsNCisgICAgICAgIHNiLmFwcGVuZCgnOicpOw0KKw0KKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7DQorICAgICAgICBmb3IgKE1haWxib3ggbWFpbGJveCA6IG1haWxib3hMaXN0KSB7DQorICAgICAgICAgICAgaWYgKGZpcnN0KSB7DQorICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOw0KKyAgICAgICAgICAgIHNiLmFwcGVuZChtYWlsYm94LmdldERpc3BsYXlTdHJpbmcoaW5jbHVkZVJvdXRlKSk7DQorICAgICAgICB9DQorDQorICAgICAgICBzYi5hcHBlbmQoIjsiKTsNCisNCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kZWRTdHJpbmcoKSB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisNCisgICAgICAgIHNiLmFwcGVuZChFbmNvZGVyVXRpbC5lbmNvZGVBZGRyZXNzRGlzcGxheU5hbWUobmFtZSkpOw0KKyAgICAgICAgc2IuYXBwZW5kKCc6Jyk7DQorDQorICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsNCisgICAgICAgIGZvciAoTWFpbGJveCBtYWlsYm94IDogbWFpbGJveExpc3QpIHsNCisgICAgICAgICAgICBpZiAoZmlyc3QpIHsNCisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7DQorICAgICAgICAgICAgc2IuYXBwZW5kKG1haWxib3guZ2V0RW5jb2RlZFN0cmluZygpKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHNiLmFwcGVuZCgnOycpOw0KKw0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHByb3RlY3RlZCB2b2lkIGRvQWRkTWFpbGJveGVzVG8oTGlzdDxNYWlsYm94PiByZXN1bHRzKSB7DQorICAgICAgICBmb3IgKE1haWxib3ggbWFpbGJveCA6IG1haWxib3hMaXN0KSB7DQorICAgICAgICAgICAgcmVzdWx0cy5hZGQobWFpbGJveCk7DQorICAgICAgICB9DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL01haWxib3guamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvYWRkcmVzcy9NYWlsYm94LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0NTljYwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvYWRkcmVzcy9NYWlsYm94LmphdmEKQEAgLTAsMCArMSwyODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3M7DQorDQoraW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5FbmNvZGVyVXRpbDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXIuQWRkcmVzc0xpc3RQYXJzZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLlBhcnNlRXhjZXB0aW9uOw0KKw0KKy8qKg0KKyAqIFJlcHJlc2VudHMgYSBzaW5nbGUgZS1tYWlsIGFkZHJlc3MuDQorICovDQorcHVibGljIGNsYXNzIE1haWxib3ggZXh0ZW5kcyBBZGRyZXNzIHsNCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERvbWFpbkxpc3QgRU1QVFlfUk9VVEVfTElTVCA9IG5ldyBEb21haW5MaXN0KA0KKyAgICAgICAgICAgIENvbGxlY3Rpb25zLjxTdHJpbmc+IGVtcHR5TGlzdCgpLCB0cnVlKTsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsNCisgICAgcHJpdmF0ZSBmaW5hbCBEb21haW5MaXN0IHJvdXRlOw0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbFBhcnQ7DQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRvbWFpbjsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYW4gdW5uYW1lZCBtYWlsYm94IHdpdGhvdXQgYSByb3V0ZS4gUm91dGVzIGFyZSBvYnNvbGV0ZS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBsb2NhbFBhcnQNCisgICAgICogICAgICAgICAgICBUaGUgcGFydCBvZiB0aGUgZS1tYWlsIGFkZHJlc3MgdG8gdGhlIGxlZnQgb2YgdGhlICJAIi4NCisgICAgICogQHBhcmFtIGRvbWFpbg0KKyAgICAgKiAgICAgICAgICAgIFRoZSBwYXJ0IG9mIHRoZSBlLW1haWwgYWRkcmVzcyB0byB0aGUgcmlnaHQgb2YgdGhlICJAIi4NCisgICAgICovDQorICAgIHB1YmxpYyBNYWlsYm94KFN0cmluZyBsb2NhbFBhcnQsIFN0cmluZyBkb21haW4pIHsNCisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbG9jYWxQYXJ0LCBkb21haW4pOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGFuIHVubmFtZWQgbWFpbGJveCB3aXRoIGEgcm91dGUuIFJvdXRlcyBhcmUgb2Jzb2xldGUuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcm91dGUNCisgICAgICogICAgICAgICAgICBUaGUgemVybyBvciBtb3JlIGRvbWFpbnMgdGhhdCBtYWtlIHVwIHRoZSByb3V0ZS4gTWF5IGJlDQorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqIEBwYXJhbSBsb2NhbFBhcnQNCisgICAgICogICAgICAgICAgICBUaGUgcGFydCBvZiB0aGUgZS1tYWlsIGFkZHJlc3MgdG8gdGhlIGxlZnQgb2YgdGhlICJAIi4NCisgICAgICogQHBhcmFtIGRvbWFpbg0KKyAgICAgKiAgICAgICAgICAgIFRoZSBwYXJ0IG9mIHRoZSBlLW1haWwgYWRkcmVzcyB0byB0aGUgcmlnaHQgb2YgdGhlICJAIi4NCisgICAgICovDQorICAgIHB1YmxpYyBNYWlsYm94KERvbWFpbkxpc3Qgcm91dGUsIFN0cmluZyBsb2NhbFBhcnQsIFN0cmluZyBkb21haW4pIHsNCisgICAgICAgIHRoaXMobnVsbCwgcm91dGUsIGxvY2FsUGFydCwgZG9tYWluKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5hbWVkIG1haWxib3ggd2l0aG91dCBhIHJvdXRlLiBSb3V0ZXMgYXJlIG9ic29sZXRlLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIG5hbWUNCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZS1tYWlsIGFkZHJlc3MuIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4NCisgICAgICogQHBhcmFtIGxvY2FsUGFydA0KKyAgICAgKiAgICAgICAgICAgIFRoZSBwYXJ0IG9mIHRoZSBlLW1haWwgYWRkcmVzcyB0byB0aGUgbGVmdCBvZiB0aGUgIkAiLg0KKyAgICAgKiBAcGFyYW0gZG9tYWluDQorICAgICAqICAgICAgICAgICAgVGhlIHBhcnQgb2YgdGhlIGUtbWFpbCBhZGRyZXNzIHRvIHRoZSByaWdodCBvZiB0aGUgIkAiLg0KKyAgICAgKi8NCisgICAgcHVibGljIE1haWxib3goU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhbFBhcnQsIFN0cmluZyBkb21haW4pIHsNCisgICAgICAgIHRoaXMobmFtZSwgbnVsbCwgbG9jYWxQYXJ0LCBkb21haW4pOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgbmFtZWQgbWFpbGJveCB3aXRoIGEgcm91dGUuIFJvdXRlcyBhcmUgb2Jzb2xldGUuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gbmFtZQ0KKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBlLW1haWwgYWRkcmVzcy4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Lg0KKyAgICAgKiBAcGFyYW0gcm91dGUNCisgICAgICogICAgICAgICAgICBUaGUgemVybyBvciBtb3JlIGRvbWFpbnMgdGhhdCBtYWtlIHVwIHRoZSByb3V0ZS4gTWF5IGJlDQorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqIEBwYXJhbSBsb2NhbFBhcnQNCisgICAgICogICAgICAgICAgICBUaGUgcGFydCBvZiB0aGUgZS1tYWlsIGFkZHJlc3MgdG8gdGhlIGxlZnQgb2YgdGhlICJAIi4NCisgICAgICogQHBhcmFtIGRvbWFpbg0KKyAgICAgKiAgICAgICAgICAgIFRoZSBwYXJ0IG9mIHRoZSBlLW1haWwgYWRkcmVzcyB0byB0aGUgcmlnaHQgb2YgdGhlICJAIi4NCisgICAgICovDQorICAgIHB1YmxpYyBNYWlsYm94KFN0cmluZyBuYW1lLCBEb21haW5MaXN0IHJvdXRlLCBTdHJpbmcgbG9jYWxQYXJ0LA0KKyAgICAgICAgICAgIFN0cmluZyBkb21haW4pIHsNCisgICAgICAgIGlmIChsb2NhbFBhcnQgPT0gbnVsbCB8fCBsb2NhbFBhcnQubGVuZ3RoKCkgPT0gMCkNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7DQorDQorICAgICAgICB0aGlzLm5hbWUgPSBuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwID8gbnVsbCA6IG5hbWU7DQorICAgICAgICB0aGlzLnJvdXRlID0gcm91dGUgPT0gbnVsbCA/IEVNUFRZX1JPVVRFX0xJU1QgOiByb3V0ZTsNCisgICAgICAgIHRoaXMubG9jYWxQYXJ0ID0gbG9jYWxQYXJ0Ow0KKyAgICAgICAgdGhpcy5kb21haW4gPSBkb21haW4gPT0gbnVsbCB8fCBkb21haW4ubGVuZ3RoKCkgPT0gMCA/IG51bGwgOiBkb21haW47DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuYW1lZCBtYWlsYm94IGJhc2VkIG9uIGFuIHVubmFtZWQgbWFpbGJveC4gUGFja2FnZSBwcml2YXRlOw0KKyAgICAgKiBpbnRlcm5hbGx5IHVzZWQgYnkgQnVpbGRlci4NCisgICAgICovDQorICAgIE1haWxib3goU3RyaW5nIG5hbWUsIE1haWxib3ggYmFzZU1haWxib3gpIHsNCisgICAgICAgIHRoaXMobmFtZSwgYmFzZU1haWxib3guZ2V0Um91dGUoKSwgYmFzZU1haWxib3guZ2V0TG9jYWxQYXJ0KCksDQorICAgICAgICAgICAgICAgIGJhc2VNYWlsYm94LmdldERvbWFpbigpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgcmF3IHN0cmluZyBpbnRvIGEgbWFpbGJveCBhZGRyZXNzLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIHJhd01haWxib3hTdHJpbmcNCisgICAgICogICAgICAgICAgICBzdHJpbmcgdG8gcGFyc2UuDQorICAgICAqIEByZXR1cm4gYSA8Y29kZT5NYWlsYm94PC9jb2RlPiBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgc3RyaW5nLg0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbg0KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgcmF3IHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYSBzaW5nbGUgbWFpbGJveA0KKyAgICAgKiAgICAgICAgICAgICBhZGRyZXNzLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBNYWlsYm94IHBhcnNlKFN0cmluZyByYXdNYWlsYm94U3RyaW5nKSB7DQorICAgICAgICBBZGRyZXNzTGlzdFBhcnNlciBwYXJzZXIgPSBuZXcgQWRkcmVzc0xpc3RQYXJzZXIobmV3IFN0cmluZ1JlYWRlcigNCisgICAgICAgICAgICAgICAgcmF3TWFpbGJveFN0cmluZykpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICByZXR1cm4gQnVpbGRlci5nZXRJbnN0YW5jZSgpLmJ1aWxkTWFpbGJveChwYXJzZXIucGFyc2VNYWlsYm94KCkpOw0KKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG1haWxib3ggb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcyBub3QNCisgICAgICogaGF2ZSBhIG5hbWUuDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7DQorICAgICAgICByZXR1cm4gbmFtZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgcm91dGUgbGlzdC4gSWYgdGhlIG1haWxib3ggZG9lcyBub3QgaGF2ZSBhIHJvdXRlIGFuIGVtcHR5DQorICAgICAqIGRvbWFpbiBsaXN0IGlzIHJldHVybmVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIERvbWFpbkxpc3QgZ2V0Um91dGUoKSB7DQorICAgICAgICByZXR1cm4gcm91dGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGxlZnQgcGFydCBvZiB0aGUgZS1tYWlsIGFkZHJlc3MgKGJlZm9yZSAiQCIpLg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXRMb2NhbFBhcnQoKSB7DQorICAgICAgICByZXR1cm4gbG9jYWxQYXJ0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSByaWdodCBwYXJ0IG9mIHRoZSBlLW1haWwgYWRkcmVzcyAoYWZ0ZXIgIkAiKS4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCkgew0KKyAgICAgICAgcmV0dXJuIGRvbWFpbjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgYWRkcmVzcyBpbiB0aGUgZm9ybSA8aT5sb2NhbFBhcnRAZG9tYWluPC9pPi4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gdGhlIGFkZHJlc3MgcGFydCBvZiB0aGlzIG1haWxib3guDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFkZHJlc3MoKSB7DQorICAgICAgICBpZiAoZG9tYWluID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gbG9jYWxQYXJ0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gbG9jYWxQYXJ0ICsgJ0AnICsgZG9tYWluOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoYm9vbGVhbiBpbmNsdWRlUm91dGUpIHsNCisgICAgICAgIGluY2x1ZGVSb3V0ZSAmPSByb3V0ZSAhPSBudWxsOw0KKyAgICAgICAgYm9vbGVhbiBpbmNsdWRlQW5nbGVCcmFja2V0cyA9IG5hbWUgIT0gbnVsbCB8fCBpbmNsdWRlUm91dGU7DQorDQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisNCisgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBzYi5hcHBlbmQobmFtZSk7DQorICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoaW5jbHVkZUFuZ2xlQnJhY2tldHMpIHsNCisgICAgICAgICAgICBzYi5hcHBlbmQoJzwnKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGlmIChpbmNsdWRlUm91dGUpIHsNCisgICAgICAgICAgICBzYi5hcHBlbmQocm91dGUudG9Sb3V0ZVN0cmluZygpKTsNCisgICAgICAgICAgICBzYi5hcHBlbmQoJzonKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHNiLmFwcGVuZChsb2NhbFBhcnQpOw0KKw0KKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgc2IuYXBwZW5kKCdAJyk7DQorICAgICAgICAgICAgc2IuYXBwZW5kKGRvbWFpbik7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoaW5jbHVkZUFuZ2xlQnJhY2tldHMpIHsNCisgICAgICAgICAgICBzYi5hcHBlbmQoJz4nKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kZWRTdHJpbmcoKSB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisNCisgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsNCisgICAgICAgICAgICBzYi5hcHBlbmQoRW5jb2RlclV0aWwuZW5jb2RlQWRkcmVzc0Rpc3BsYXlOYW1lKG5hbWUpKTsNCisgICAgICAgICAgICBzYi5hcHBlbmQoIiA8Iik7DQorICAgICAgICB9DQorDQorICAgICAgICBzYi5hcHBlbmQoRW5jb2RlclV0aWwuZW5jb2RlQWRkcmVzc0xvY2FsUGFydChsb2NhbFBhcnQpKTsNCisNCisgICAgICAgIC8vIGRvbWFpbiA9IGRvdC1hdG9tIC8gZG9tYWluLWxpdGVyYWwNCisgICAgICAgIC8vIGRvbWFpbi1saXRlcmFsID0gW0NGV1NdICJbIiAqKFtGV1NdIGR0ZXh0KSBbRldTXSAiXSIgW0NGV1NdDQorICAgICAgICAvLyBkdGV4dCA9ICVkMzMtOTAgLyAlZDk0LTEyNg0KKyAgICAgICAgaWYgKGRvbWFpbiAhPSBudWxsKSB7DQorICAgICAgICAgICAgc2IuYXBwZW5kKCdAJyk7DQorICAgICAgICAgICAgc2IuYXBwZW5kKGRvbWFpbik7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgc2IuYXBwZW5kKCc+Jyk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgIHJldHVybiBnZXRDYW5vbmljYWxpemVkQWRkcmVzcygpLmhhc2hDb2RlKCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHNvbWUgb3RoZXIgb2JqZWN0IGlzICJlcXVhbCB0byIgdGhpcyBtYWlsYm94Lg0KKyAgICAgKiA8cD4NCisgICAgICogQW4gb2JqZWN0IGlzIGNvbnNpZGVyZWQgdG8gYmUgZXF1YWwgdG8gdGhpcyBtYWlsYm94IGlmIGl0IGlzIGFuIGluc3RhbmNlDQorICAgICAqIG9mIGNsYXNzIDxjb2RlPk1haWxib3g8L2NvZGU+IHRoYXQgaG9sZHMgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGlzIG9uZS4NCisgICAgICogVGhlIGRvbWFpbiBpcyBjb25zaWRlcmVkIHRvIGJlIGNhc2UtaW5zZW5zaXRpdmUgYnV0IHRoZSBsb2NhbC1wYXJ0IGlzIG5vdA0KKyAgICAgKiAoYmVjYXVzZSBvZiBSRkMgNTMyMTogPGNpdGU+dGhlIGxvY2FsLXBhcnQgb2YgYSBtYWlsYm94IE1VU1QgQkUgdHJlYXRlZA0KKyAgICAgKiBhcyBjYXNlIHNlbnNpdGl2ZTwvY2l0ZT4pLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIG9iag0KKyAgICAgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdG8gdGVzdCBmb3IgZXF1YWxpdHkuDQorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYQ0KKyAgICAgKiAgICAgICAgIDxjb2RlPk1haWxib3g8L2NvZGU+IHRoYXQgaG9sZHMgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGlzIG9uZS4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KKyAgICAgICAgaWYgKG9iaiA9PSB0aGlzKQ0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOw0KKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTWFpbGJveCkpDQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKw0KKyAgICAgICAgTWFpbGJveCBvdGhlciA9IChNYWlsYm94KSBvYmo7DQorICAgICAgICByZXR1cm4gZ2V0Q2Fub25pY2FsaXplZEFkZHJlc3MoKQ0KKyAgICAgICAgICAgICAgICAuZXF1YWxzKG90aGVyLmdldENhbm9uaWNhbGl6ZWRBZGRyZXNzKCkpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBkb0FkZE1haWxib3hlc1RvKExpc3Q8TWFpbGJveD4gcmVzdWx0cykgew0KKyAgICAgICAgcmVzdWx0cy5hZGQodGhpcyk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0Q2Fub25pY2FsaXplZEFkZHJlc3MoKSB7DQorICAgICAgICBpZiAoZG9tYWluID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gbG9jYWxQYXJ0Ow0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gbG9jYWxQYXJ0ICsgJ0AnICsgZG9tYWluLnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7DQorICAgICAgICB9DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL01haWxib3hMaXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvTWFpbGJveExpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjAyMzU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL01haWxib3hMaXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzczsNCisNCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQoraW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQorDQorLyoqDQorICogQW4gaW1tdXRhYmxlLCByYW5kb20tYWNjZXNzIGxpc3Qgb2YgTWFpbGJveCBvYmplY3RzLg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBNYWlsYm94TGlzdCBleHRlbmRzIEFic3RyYWN0TGlzdDxNYWlsYm94PiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KKw0KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TWFpbGJveD4gbWFpbGJveGVzOw0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG1haWxib3hlcw0KKyAgICAgKiAgICAgICAgICAgIEEgTGlzdCB0aGF0IGNvbnRhaW5zIG9ubHkgTWFpbGJveCBvYmplY3RzLg0KKyAgICAgKiBAcGFyYW0gZG9udENvcHkNCisgICAgICogICAgICAgICAgICB0cnVlIGlmZiBpdCBpcyBub3QgcG9zc2libGUgZm9yIHRoZSBtYWlsYm94ZXMgbGlzdCB0byBiZQ0KKyAgICAgKiAgICAgICAgICAgIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZS4NCisgICAgICovDQorICAgIHB1YmxpYyBNYWlsYm94TGlzdChMaXN0PE1haWxib3g+IG1haWxib3hlcywgYm9vbGVhbiBkb250Q29weSkgew0KKyAgICAgICAgaWYgKG1haWxib3hlcyAhPSBudWxsKQ0KKyAgICAgICAgICAgIHRoaXMubWFpbGJveGVzID0gZG9udENvcHkgPyBtYWlsYm94ZXMgOiBuZXcgQXJyYXlMaXN0PE1haWxib3g+KA0KKyAgICAgICAgICAgICAgICAgICAgbWFpbGJveGVzKTsNCisgICAgICAgIGVsc2UNCisgICAgICAgICAgICB0aGlzLm1haWxib3hlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgbGlzdC4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7DQorICAgICAgICByZXR1cm4gbWFpbGJveGVzLnNpemUoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogR2V0cyBhbiBhZGRyZXNzLg0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBNYWlsYm94IGdldChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBtYWlsYm94ZXMuZ2V0KGluZGV4KTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogRHVtcHMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1haWxib3ggbGlzdCB0byBzdGRvdXQsIGZvciBkZWJ1Z2dpbmcNCisgICAgICogcHVycG9zZXMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBwcmludCgpIHsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsNCisgICAgICAgICAgICBNYWlsYm94IG1haWxib3ggPSBnZXQoaSk7DQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1haWxib3gudG9TdHJpbmcoKSk7DQorICAgICAgICB9DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL3BhcnNlci9CYXNlTm9kZS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL3BhcnNlci9CYXNlTm9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MWJjNDQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvcGFyc2VyL0Jhc2VOb2RlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXI7DQorDQorDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlIGltcGxlbWVudHMgTm9kZSB7DQorICANCisgIHB1YmxpYyBUb2tlbiBmaXJzdFRva2VuOw0KKyAgcHVibGljIFRva2VuIGxhc3RUb2tlbjsNCisNCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9kYXRldGltZS9EYXRlVGltZS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9kYXRldGltZS9EYXRlVGltZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZmY3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2RhdGV0aW1lL0RhdGVUaW1lLmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmRhdGV0aW1lOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7DQoraW1wb3J0IGphdmEudXRpbC5EYXRlOw0KK2ltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7DQoraW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsNCisNCitwdWJsaWMgY2xhc3MgRGF0ZVRpbWUgew0KKyAgICBwcml2YXRlIGZpbmFsIERhdGUgZGF0ZTsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgeWVhcjsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbW9udGg7DQorICAgIHByaXZhdGUgZmluYWwgaW50IGRheTsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaG91cjsNCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWludXRlOw0KKyAgICBwcml2YXRlIGZpbmFsIGludCBzZWNvbmQ7DQorICAgIHByaXZhdGUgZmluYWwgaW50IHRpbWVab25lOw0KKw0KKyAgICBwdWJsaWMgRGF0ZVRpbWUoU3RyaW5nIHllYXJTdHJpbmcsIGludCBtb250aCwgaW50IGRheSwgaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQsIGludCB0aW1lWm9uZSkgew0KKyAgICAgICAgdGhpcy55ZWFyID0gY29udmVydFRvWWVhcih5ZWFyU3RyaW5nKTsNCisgICAgICAgIHRoaXMuZGF0ZSA9IGNvbnZlcnRUb0RhdGUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIHRpbWVab25lKTsNCisgICAgICAgIHRoaXMubW9udGggPSBtb250aDsNCisgICAgICAgIHRoaXMuZGF5ID0gZGF5Ow0KKyAgICAgICAgdGhpcy5ob3VyID0gaG91cjsNCisgICAgICAgIHRoaXMubWludXRlID0gbWludXRlOw0KKyAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7DQorICAgICAgICB0aGlzLnRpbWVab25lID0gdGltZVpvbmU7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBpbnQgY29udmVydFRvWWVhcihTdHJpbmcgeWVhclN0cmluZykgew0KKyAgICAgICAgaW50IHllYXIgPSBJbnRlZ2VyLnBhcnNlSW50KHllYXJTdHJpbmcpOw0KKyAgICAgICAgc3dpdGNoICh5ZWFyU3RyaW5nLmxlbmd0aCgpKSB7DQorICAgICAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgIGNhc2UgMjoNCisgICAgICAgICAgICAgICAgaWYgKHllYXIgPj0gMCAmJiB5ZWFyIDwgNTApDQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjAwMCArIHllYXI7DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOTAwICsgeWVhcjsNCisgICAgICAgICAgICBjYXNlIDM6DQorICAgICAgICAgICAgICAgIHJldHVybiAxOTAwICsgeWVhcjsNCisgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICByZXR1cm4geWVhcjsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgc3RhdGljIERhdGUgY29udmVydFRvRGF0ZShpbnQgeWVhciwgaW50IG1vbnRoLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCwgaW50IHRpbWVab25lKSB7DQorICAgICAgICBDYWxlbmRhciBjID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQrMCIpKTsNCisgICAgICAgIGMuc2V0KHllYXIsIG1vbnRoIC0gMSwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCk7DQorICAgICAgICBjLnNldChDYWxlbmRhci5NSUxMSVNFQ09ORCwgMCk7DQorDQorICAgICAgICBpZiAodGltZVpvbmUgIT0gSW50ZWdlci5NSU5fVkFMVUUpIHsNCisgICAgICAgICAgICBpbnQgbWludXRlcyA9ICgodGltZVpvbmUgLyAxMDApICogNjApICsgdGltZVpvbmUgJSAxMDA7DQorICAgICAgICAgICAgYy5hZGQoQ2FsZW5kYXIuTUlOVVRFLCAtMSAqIG1pbnV0ZXMpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmV0dXJuIGMuZ2V0VGltZSgpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBEYXRlIGdldERhdGUoKSB7DQorICAgICAgICByZXR1cm4gZGF0ZTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldFllYXIoKSB7DQorICAgICAgICByZXR1cm4geWVhcjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1vbnRoKCkgew0KKyAgICAgICAgcmV0dXJuIG1vbnRoOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0RGF5KCkgew0KKyAgICAgICAgcmV0dXJuIGRheTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldEhvdXIoKSB7DQorICAgICAgICByZXR1cm4gaG91cjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgaW50IGdldE1pbnV0ZSgpIHsNCisgICAgICAgIHJldHVybiBtaW51dGU7DQorICAgIH0NCisNCisgICAgcHVibGljIGludCBnZXRTZWNvbmQoKSB7DQorICAgICAgICByZXR1cm4gc2Vjb25kOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0VGltZVpvbmUoKSB7DQorICAgICAgICByZXR1cm4gdGltZVpvbmU7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgcHJpbnQoKSB7DQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9TdHJpbmcoKSk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQorICAgICAgICByZXR1cm4gZ2V0WWVhcigpICsgIiAiICsgZ2V0TW9udGgoKSArICIgIiArIGdldERheSgpICsgIjsgIiArIGdldEhvdXIoKSArICIgIiArIGdldE1pbnV0ZSgpICsgIiAiICsgZ2V0U2Vjb25kKCkgKyAiICIgKyBnZXRUaW1lWm9uZSgpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KKyAgICAgICAgZmluYWwgaW50IFBSSU1FID0gMzE7DQorICAgICAgICBpbnQgcmVzdWx0ID0gMTsNCisgICAgICAgIHJlc3VsdCA9IFBSSU1FICogcmVzdWx0ICsgKChkYXRlID09IG51bGwpID8gMCA6IGRhdGUuaGFzaENvZGUoKSk7DQorICAgICAgICByZXN1bHQgPSBQUklNRSAqIHJlc3VsdCArIGRheTsNCisgICAgICAgIHJlc3VsdCA9IFBSSU1FICogcmVzdWx0ICsgaG91cjsNCisgICAgICAgIHJlc3VsdCA9IFBSSU1FICogcmVzdWx0ICsgbWludXRlOw0KKyAgICAgICAgcmVzdWx0ID0gUFJJTUUgKiByZXN1bHQgKyBtb250aDsNCisgICAgICAgIHJlc3VsdCA9IFBSSU1FICogcmVzdWx0ICsgc2Vjb25kOw0KKyAgICAgICAgcmVzdWx0ID0gUFJJTUUgKiByZXN1bHQgKyB0aW1lWm9uZTsNCisgICAgICAgIHJlc3VsdCA9IFBSSU1FICogcmVzdWx0ICsgeWVhcjsNCisgICAgICAgIHJldHVybiByZXN1bHQ7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQorICAgICAgICBpZiAodGhpcyA9PSBvYmopDQorICAgICAgICAgICAgcmV0dXJuIHRydWU7DQorICAgICAgICBpZiAob2JqID09IG51bGwpDQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpDQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgZmluYWwgRGF0ZVRpbWUgb3RoZXIgPSAoRGF0ZVRpbWUpIG9iajsNCisgICAgICAgIGlmIChkYXRlID09IG51bGwpIHsNCisgICAgICAgICAgICBpZiAob3RoZXIuZGF0ZSAhPSBudWxsKQ0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICB9IGVsc2UgaWYgKCFkYXRlLmVxdWFscyhvdGhlci5kYXRlKSkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoZGF5ICE9IG90aGVyLmRheSkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoaG91ciAhPSBvdGhlci5ob3VyKQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIGlmIChtaW51dGUgIT0gb3RoZXIubWludXRlKQ0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCisgICAgICAgIGlmIChtb250aCAhPSBvdGhlci5tb250aCkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAoc2Vjb25kICE9IG90aGVyLnNlY29uZCkNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICBpZiAodGltZVpvbmUgIT0gb3RoZXIudGltZVpvbmUpDQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgaWYgKHllYXIgIT0gb3RoZXIueWVhcikNCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICByZXR1cm4gdHJ1ZTsNCisgICAgfQ0KKw0KKyAgICANCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9CdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9CdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWFjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0J1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwzNDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkJ5dGVBcnJheUJ1ZmZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBJbnB1dCBidWZmZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzZWFyY2ggZm9yIHBhdHRlcm5zIHVzaW5nIFF1aWNrIFNlYXJjaCAKKyAqIGFsZ29yaXRobSBpbiBkYXRhIHJlYWQgZnJvbSBhbiB7QGxpbmsgSW5wdXRTdHJlYW19LiAKKyAqLworcHVibGljIGNsYXNzIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGV4dGVuZHMgTGluZVJlYWRlcklucHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgYm9vbGVhbiB0cnVuY2F0ZWQ7CisgICAgCisgICAgcHJpdmF0ZSBieXRlW10gYnVmZmVyOworICAgIAorICAgIHByaXZhdGUgaW50IGJ1ZnBvczsKKyAgICBwcml2YXRlIGludCBidWZsZW47CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4TGluZUxlbjsKKyAgICAKKyAgICBwdWJsaWMgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0oCisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbnN0cmVhbSwgCisgICAgICAgICAgICBpbnQgYnVmZmVyc2l6ZSwKKyAgICAgICAgICAgIGludCBtYXhMaW5lTGVuKSB7CisgICAgICAgIHN1cGVyKGluc3RyZWFtKTsKKyAgICAgICAgaWYgKGluc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklucHV0IHN0cmVhbSBtYXkgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCdWZmZXIgc2l6ZSBtYXkgbm90IGJlIG5lZ2F0aXZlIG9yIHplcm8iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlcnNpemVdOworICAgICAgICB0aGlzLmJ1ZnBvcyA9IDA7CisgICAgICAgIHRoaXMuYnVmbGVuID0gMDsKKyAgICAgICAgdGhpcy5tYXhMaW5lTGVuID0gbWF4TGluZUxlbjsKKyAgICAgICAgdGhpcy50cnVuY2F0ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0oCisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbnN0cmVhbSwgCisgICAgICAgICAgICBpbnQgYnVmZmVyc2l6ZSkgeworICAgICAgICB0aGlzKGluc3RyZWFtLCBidWZmZXJzaXplLCAtMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGFuZChpbnQgbmV3bGVuKSB7CisgICAgICAgIGJ5dGUgbmV3YnVmZmVyW10gPSBuZXcgYnl0ZVtuZXdsZW5dOworICAgICAgICBpbnQgbGVuID0gdGhpcy5idWZsZW4gLSB0aGlzLmJ1ZnBvczsKKyAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5idWZmZXIsIHRoaXMuYnVmcG9zLCBuZXdidWZmZXIsIHRoaXMuYnVmcG9zLCBsZW4pOworICAgICAgICB9CisgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3YnVmZmVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgbGVuKSB7CisgICAgICAgIGlmIChsZW4gPiB0aGlzLmJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAgIGV4cGFuZChsZW4pOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgZmlsbEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNvbXBhY3QgdGhlIGJ1ZmZlciBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKHRoaXMuYnVmcG9zID4gMCkgeworICAgICAgICAgICAgaW50IGxlbiA9IHRoaXMuYnVmbGVuIC0gdGhpcy5idWZwb3M7CisgICAgICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5idWZmZXIsIHRoaXMuYnVmcG9zLCB0aGlzLmJ1ZmZlciwgMCwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuYnVmcG9zID0gMDsKKyAgICAgICAgICAgIHRoaXMuYnVmbGVuID0gbGVuOworICAgICAgICB9CisgICAgICAgIGludCBsOworICAgICAgICBpbnQgb2ZmID0gdGhpcy5idWZsZW47CisgICAgICAgIGludCBsZW4gPSB0aGlzLmJ1ZmZlci5sZW5ndGggLSBvZmY7CisgICAgICAgIGwgPSBpbi5yZWFkKHRoaXMuYnVmZmVyLCBvZmYsIGxlbik7CisgICAgICAgIGlmIChsID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmJ1ZmxlbiA9IG9mZiArIGw7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc0J1ZmZlcmVkRGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYnVmcG9zIDwgdGhpcy5idWZsZW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdHJ1bmNhdGUoKSB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIHRoaXMudHJ1bmNhdGVkID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMudHJ1bmNhdGVkKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5vUmVhZCA9IDA7CisgICAgICAgIHdoaWxlICghaGFzQnVmZmVyZWREYXRhKCkpIHsKKyAgICAgICAgICAgIG5vUmVhZCA9IGZpbGxCdWZmZXIoKTsKKyAgICAgICAgICAgIGlmIChub1JlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMuYnVmcG9zKytdICYgMHhmZjsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy50cnVuY2F0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpbnQgbm9SZWFkID0gMDsKKyAgICAgICAgd2hpbGUgKCFoYXNCdWZmZXJlZERhdGEoKSkgeworICAgICAgICAgICAgbm9SZWFkID0gZmlsbEJ1ZmZlcigpOworICAgICAgICAgICAgaWYgKG5vUmVhZCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgY2h1bmsgPSB0aGlzLmJ1ZmxlbiAtIHRoaXMuYnVmcG9zOworICAgICAgICBpZiAoY2h1bmsgPiBsZW4pIHsKKyAgICAgICAgICAgIGNodW5rID0gbGVuOworICAgICAgICB9CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGhpcy5idWZmZXIsIHRoaXMuYnVmcG9zLCBiLCBvZmYsIGNodW5rKTsKKyAgICAgICAgdGhpcy5idWZwb3MgKz0gY2h1bms7CisgICAgICAgIHJldHVybiBjaHVuazsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy50cnVuY2F0ZWQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVhZChiLCAwLCBiLmxlbmd0aCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWRMaW5lKGZpbmFsIEJ5dGVBcnJheUJ1ZmZlciBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnVmZmVyIG1heSBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnRydW5jYXRlZCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGludCB0b3RhbCA9IDA7CisgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgaW50IGJ5dGVzUmVhZCA9IDA7CisgICAgICAgIHdoaWxlICghZm91bmQpIHsKKyAgICAgICAgICAgIGlmICghaGFzQnVmZmVyZWREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICBieXRlc1JlYWQgPSBmaWxsQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaSA9IGluZGV4T2YoKGJ5dGUpJ1xuJyk7CisgICAgICAgICAgICBpbnQgY2h1bms7CisgICAgICAgICAgICBpZiAoaSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjaHVuayA9IGkgKyAxIC0gcG9zKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNodW5rID0gbGVuZ3RoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2h1bmsgPiAwKSB7CisgICAgICAgICAgICAgICAgZHN0LmFwcGVuZChidWYoKSwgcG9zKCksIGNodW5rKTsKKyAgICAgICAgICAgICAgICBza2lwKGNodW5rKTsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSBjaHVuazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm1heExpbmVMZW4gPiAwICYmIGRzdC5sZW5ndGgoKSA+PSB0aGlzLm1heExpbmVMZW4pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWF4TGluZUxpbWl0RXhjZXB0aW9uKCJNYXhpbXVtIGxpbmUgbGVuZ3RoIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvdGFsID09IDAgJiYgYnl0ZXNSZWFkID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdG90YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHF1aWNrIHNlYXJjaCBhbGdvcml0aG0gYXMgcHVibGlzaGVkIGJ5CisgICAgICogPHA+IAorICAgICAqIFNVTkRBWSBELk0uLCAxOTkwLCAKKyAgICAgKiBBIHZlcnkgZmFzdCBzdWJzdHJpbmcgc2VhcmNoIGFsZ29yaXRobSwgCisgICAgICogQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFDTSAuIDMzKDgpOjEzMi0xNDIuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaW5kZXhPZihmaW5hbCBieXRlW10gcGF0dGVybiwgaW50IG9mZiwgaW50IGxlbikgeworICAgICAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYXR0ZXJuIG1heSBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIGlmIChvZmYgPCB0aGlzLmJ1ZnBvcyB8fCBsZW4gPCAwIHx8IG9mZiArIGxlbiA+IHRoaXMuYnVmbGVuKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4gPCBwYXR0ZXJuLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpbnRbXSBzaGlmdFRhYmxlID0gbmV3IGludFsyNTZdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNoaWZ0VGFibGUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHNoaWZ0VGFibGVbaV0gPSBwYXR0ZXJuLmxlbmd0aCArIDE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXR0ZXJuLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeCA9IHBhdHRlcm5baV0gJiAweGZmOworICAgICAgICAgICAgc2hpZnRUYWJsZVt4XSA9IHBhdHRlcm4ubGVuZ3RoIC0gaTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW50IGogPSAwOworICAgICAgICB3aGlsZSAoaiA8PSBsZW4gLSBwYXR0ZXJuLmxlbmd0aCkgeworICAgICAgICAgICAgaW50IGN1ciA9IG9mZiArIGo7CisgICAgICAgICAgICBib29sZWFuIG1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcltjdXIgKyBpXSAhPSBwYXR0ZXJuW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXRjaCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjdXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBwb3MgPSBjdXIgKyBwYXR0ZXJuLmxlbmd0aDsgCisgICAgICAgICAgICBpZiAocG9zID49IHRoaXMuYnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHggPSB0aGlzLmJ1ZmZlcltwb3NdICYgMHhmZjsKKyAgICAgICAgICAgIGogKz0gc2hpZnRUYWJsZVt4XTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEltcGxlbWVudHMgcXVpY2sgc2VhcmNoIGFsZ29yaXRobSBhcyBwdWJsaXNoZWQgYnkKKyAgICAgKiA8cD4gCisgICAgICogU1VOREFZIEQuTS4sIDE5OTAsIAorICAgICAqIEEgdmVyeSBmYXN0IHN1YnN0cmluZyBzZWFyY2ggYWxnb3JpdGhtLCAKKyAgICAgKiBDb21tdW5pY2F0aW9ucyBvZiB0aGUgQUNNIC4gMzMoOCk6MTMyLTE0Mi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIGludCBpbmRleE9mKGZpbmFsIGJ5dGVbXSBwYXR0ZXJuKSB7CisgICAgICAgIHJldHVybiBpbmRleE9mKHBhdHRlcm4sIHRoaXMuYnVmcG9zLCB0aGlzLmJ1ZmxlbiAtIHRoaXMuYnVmcG9zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGluZGV4T2YoYnl0ZSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CisgICAgICAgIGlmIChvZmYgPCB0aGlzLmJ1ZnBvcyB8fCBsZW4gPCAwIHx8IG9mZiArIGxlbiA+IHRoaXMuYnVmbGVuKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCBvZmYgKyBsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyW2ldID09IGIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgaW5kZXhPZihieXRlIGIpIHsKKyAgICAgICAgcmV0dXJuIGluZGV4T2YoYiwgdGhpcy5idWZwb3MsIHRoaXMuYnVmbGVuIC0gdGhpcy5idWZwb3MpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYnl0ZSBjaGFyQXQoaW50IHBvcykgeworICAgICAgICBpZiAocG9zIDwgdGhpcy5idWZwb3MgfHwgcG9zID4gdGhpcy5idWZsZW4pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW3Bvc107CisgICAgfQorICAgIAorICAgIHB1YmxpYyBieXRlW10gYnVmKCkgeworICAgICAgICByZXR1cm4gdGhpcy5idWZmZXI7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBwb3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJ1ZnBvczsKKyAgICB9CisgICAgCisgICAgcHVibGljIGludCBsaW1pdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYnVmbGVuOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYnVmbGVuIC0gdGhpcy5idWZwb3M7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgY2FwYWNpdHkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5sZW5ndGg7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBpbnQgc2tpcChpbnQgbikgeworICAgICAgICBpbnQgY2h1bmsgPSBNYXRoLm1pbihuLCB0aGlzLmJ1ZmxlbiAtIHRoaXMuYnVmcG9zKTsKKyAgICAgICAgdGhpcy5idWZwb3MgKz0gY2h1bms7IAorICAgICAgICByZXR1cm4gY2h1bms7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHRoaXMuYnVmcG9zID0gMDsKKyAgICAgICAgdGhpcy5idWZsZW4gPSAwOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIltwb3M6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKHRoaXMuYnVmcG9zKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCJbbGltaXQ6ICIpOworICAgICAgICBidWZmZXIuYXBwZW5kKHRoaXMuYnVmbGVuKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXSIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCJbIik7CisgICAgICAgIGZvciAoaW50IGkgPSB0aGlzLmJ1ZnBvczsgaSA8IHRoaXMuYnVmbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoKGNoYXIpIHRoaXMuYnVmZmVyW2ldKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIuYXBwZW5kKCJdIik7CisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vRU9MQ29udmVydGluZ0lucHV0U3RyZWFtLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0VPTENvbnZlcnRpbmdJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OGFkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0VPTENvbnZlcnRpbmdJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pbzsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5QdXNoYmFja0lucHV0U3RyZWFtOw0KKw0KKy8qKg0KKyAqIElucHV0U3RyZWFtIHdoaWNoIGNvbnZlcnRzIDxjb2RlPlxyPC9jb2RlPg0KKyAqIGJ5dGVzIG5vdCBmb2xsb3dlZCBieSA8Y29kZT5cbjwvY29kZT4gYW5kIDxjb2RlPlxuPC9jb2RlPiBub3QgDQorICogcHJlY2VkZWQgYnkgPGNvZGU+XHI8L2NvZGU+IHRvIDxjb2RlPlxyXG48L2NvZGU+Lg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBFT0xDb252ZXJ0aW5nSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7DQorICAgIC8qKiBDb252ZXJ0cyBzaW5nbGUgJ1xyJyB0byAnXHJcbicgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVkVSVF9DUiAgID0gMTsNCisgICAgLyoqIENvbnZlcnRzIHNpbmdsZSAnXG4nIHRvICdcclxuJyAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05WRVJUX0xGICAgPSAyOw0KKyAgICAvKiogQ29udmVydHMgc2luZ2xlICdccicgYW5kICdcbicgdG8gJ1xyXG4nICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlZFUlRfQk9USCA9IDM7DQorICAgIA0KKyAgICBwcml2YXRlIFB1c2hiYWNrSW5wdXRTdHJlYW0gaW4gPSBudWxsOw0KKyAgICBwcml2YXRlIGludCBwcmV2aW91cyA9IDA7DQorICAgIHByaXZhdGUgaW50IGZsYWdzID0gQ09OVkVSVF9CT1RIOw0KKyAgICANCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RU9MQ29udmVydGluZ0lucHV0U3RyZWFtPC9jb2RlPg0KKyAgICAgKiBpbnN0YW5jZSBjb252ZXJ0aW5nIGJ5dGVzIGluIHRoZSBnaXZlbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4uDQorICAgICAqIFRoZSBmbGFnIDxjb2RlPkNPTlZFUlRfQk9USDwvY29kZT4gaXMgdGhlIGRlZmF1bHQuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gaW4gdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB0byByZWFkIGZyb20uDQorICAgICAqLw0KKyAgICBwdWJsaWMgRU9MQ29udmVydGluZ0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluKSB7DQorICAgICAgICB0aGlzKGluLCBDT05WRVJUX0JPVEgpOw0KKyAgICB9DQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVPTENvbnZlcnRpbmdJbnB1dFN0cmVhbTwvY29kZT4NCisgICAgICogaW5zdGFuY2UgY29udmVydGluZyBieXRlcyBpbiB0aGUgZ2l2ZW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+Lg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGluIHRoZSA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gdG8gcmVhZCBmcm9tLg0KKyAgICAgKiBAcGFyYW0gZmxhZ3Mgb25lIG9mIDxjb2RlPkNPTlZFUlRfQ1I8L2NvZGU+LCA8Y29kZT5DT05WRVJUX0xGPC9jb2RlPiBvcg0KKyAgICAgKiAgICAgICAgPGNvZGU+Q09OVkVSVF9CT1RIPC9jb2RlPi4NCisgICAgICovDQorICAgIHB1YmxpYyBFT0xDb252ZXJ0aW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBmbGFncykgew0KKyAgICAgICAgc3VwZXIoKTsNCisgICAgICAgIA0KKyAgICAgICAgdGhpcy5pbiA9IG5ldyBQdXNoYmFja0lucHV0U3RyZWFtKGluLCAyKTsNCisgICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4NCisgICAgICogDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gSS9PIGVycm9ycy4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpbi5jbG9zZSgpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3JlYWQoKQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpbnQgYiA9IGluLnJlYWQoKTsNCisgICAgICAgIA0KKyAgICAgICAgaWYgKGIgPT0gLTEpIHsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGlmICgoZmxhZ3MgJiBDT05WRVJUX0NSKSAhPSAwICYmIGIgPT0gJ1xyJykgew0KKyAgICAgICAgICAgIGludCBjID0gaW4ucmVhZCgpOw0KKyAgICAgICAgICAgIGlmIChjICE9IC0xKSB7DQorICAgICAgICAgICAgICAgIGluLnVucmVhZChjKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGMgIT0gJ1xuJykgew0KKyAgICAgICAgICAgICAgICBpbi51bnJlYWQoJ1xuJyk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBDT05WRVJUX0xGKSAhPSAwICYmIGIgPT0gJ1xuJyAmJiBwcmV2aW91cyAhPSAnXHInKSB7DQorICAgICAgICAgICAgYiA9ICdccic7DQorICAgICAgICAgICAgaW4udW5yZWFkKCdcbicpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBwcmV2aW91cyA9IGI7DQorICAgICAgICANCisgICAgICAgIHJldHVybiBiOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTGltaXRlZElucHV0U3RyZWFtLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbWl0ZWRJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTQ3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbWl0ZWRJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW87CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBMaW1pdGVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBQb3NpdGlvbklucHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgZmluYWwgbG9uZyBsaW1pdDsKKworICAgIHB1YmxpYyBMaW1pdGVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5zdHJlYW0sIGxvbmcgbGltaXQpIHsKKyAgICAgICAgc3VwZXIoaW5zdHJlYW0pOworICAgICAgICBpZiAobGltaXQgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJMaW1pdCBtYXkgbm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5saW1pdCA9IGxpbWl0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmZvcmNlTGltaXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocG9zaXRpb24gPj0gbGltaXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW5wdXQgc3RyZWFtIGxpbWl0IGV4Y2VlZGVkIik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW5mb3JjZUxpbWl0KCk7CisgICAgICAgIHJldHVybiBzdXBlci5yZWFkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGJ5dGUgYltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBlbmZvcmNlTGltaXQoKTsKKyAgICAgICAgbGVuID0gTWF0aC5taW4obGVuLCBnZXRCeXRlc0xlZnQoKSk7CisgICAgICAgIHJldHVybiBzdXBlci5yZWFkKGIsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW5mb3JjZUxpbWl0KCk7CisgICAgICAgIG4gPSBNYXRoLm1pbihuLCBnZXRCeXRlc0xlZnQoKSk7CisgICAgICAgIHJldHVybiBzdXBlci5za2lwKG4pOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEJ5dGVzTGVmdCgpIHsKKyAgICAgICAgcmV0dXJuIChpbnQpTWF0aC5taW4oSW50ZWdlci5NQVhfVkFMVUUsIGxpbWl0IC0gcG9zaXRpb24pOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTGluZU51bWJlcklucHV0U3RyZWFtLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbmVOdW1iZXJJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MWYxNmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbmVOdW1iZXJJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KKw0KKy8qKg0KKyAqIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gd3JhcCB0aGUgb3JpZ2luYWwgdXNlcg0KKyAqIHN1cHBsaWVkIHN0cmVhbS4gVGhpcyBzdHJlYW0ga2VlcHMgdHJhY2sgb2YgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuDQorICovDQorcHVibGljIGNsYXNzIExpbmVOdW1iZXJJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIGltcGxlbWVudHMNCisgICAgICAgIExpbmVOdW1iZXJTb3VyY2Ugew0KKyAgICBwcml2YXRlIGludCBsaW5lTnVtYmVyID0gMTsNCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGluZU51bWJlcklucHV0U3RyZWFtPC9jb2RlPi4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBpcw0KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gcmVhZCBmcm9tLg0KKyAgICAgKi8NCisgICAgcHVibGljIExpbmVOdW1iZXJJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcykgew0KKyAgICAgICAgc3VwZXIoaXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsNCisgICAgICAgIHJldHVybiBsaW5lTnVtYmVyOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaW50IGIgPSBpbi5yZWFkKCk7DQorICAgICAgICBpZiAoYiA9PSAnXG4nKSB7DQorICAgICAgICAgICAgbGluZU51bWJlcisrOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGI7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGludCBuID0gaW4ucmVhZChiLCBvZmYsIGxlbik7DQorICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgb2ZmICsgbjsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKGJbaV0gPT0gJ1xuJykgew0KKyAgICAgICAgICAgICAgICBsaW5lTnVtYmVyKys7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG47DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9MaW5lTnVtYmVyU291cmNlLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbmVOdW1iZXJTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDA2ZmIzCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9MaW5lTnVtYmVyU291cmNlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW87DQorDQorcHVibGljIGludGVyZmFjZSBMaW5lTnVtYmVyU291cmNlIHsNCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgc3RhcnRpbmcgYXQgMSAodGhlIG51bWJlciBvZg0KKyAgICAgKiA8Y29kZT5cclxuPC9jb2RlPiByZWFkIHNvIGZhciBwbHVzIDEpLg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCBsaW5lIG51bWJlci4NCisgICAgICovDQorICAgIGludCBnZXRMaW5lTnVtYmVyKCk7DQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTGluZVJlYWRlcklucHV0U3RyZWFtLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbmVSZWFkZXJJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNWUwMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbmVSZWFkZXJJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkJ5dGVBcnJheUJ1ZmZlcjsNCisNCitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCisNCisvKioNCisgKiBJbnB1dCBzdHJlYW0gY2FwYWJsZSBvZiByZWFkaW5nIGxpbmVzIG9mIHRleHQuIA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaW5lUmVhZGVySW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7DQorDQorICAgIHByb3RlY3RlZCBMaW5lUmVhZGVySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHsNCisgICAgICAgIHN1cGVyKGluKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmVhZHMgb25lIGxpbmUgb2YgdGV4dCBpbnRvIHRoZSBnaXZlbiB7QGxpbmsgQnl0ZUFycmF5QnVmZmVyfS4NCisgICAgICogIA0KKyAgICAgKiBAcGFyYW0gZHN0IERlc3RpbmF0aW9uDQorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBvciA8Y29kZT4tMTwvY29kZT4gaWYgdGhlIGVuZCBvZiANCisgICAgICogdGhlIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLg0KKyAgICAgKiANCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIG9mIGFuIEkvTyBlcnJvci4NCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZExpbmUoZmluYWwgQnl0ZUFycmF5QnVmZmVyIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uOw0KKyAgICANCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9MaW5lUmVhZGVySW5wdXRTdHJlYW1BZGFwdG9yLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbmVSZWFkZXJJbnB1dFN0cmVhbUFkYXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzYwMjdmCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9MaW5lUmVhZGVySW5wdXRTdHJlYW1BZGFwdG9yLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkJ5dGVBcnJheUJ1ZmZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gdXNlZCBieSB0aGUgTUlNRSBwYXJzZXIgdG8gZGV0ZWN0IHdoZXRoZXIgdGhlCisgKiB1bmRlcmx5aW5nIGRhdGEgc3RyZWFtIHdhcyB1c2VkIChyZWFkIGZyb20pIGFuZCB3aGV0aGVyIHRoZSBlbmQgb2YgdGhlIAorICogc3RyZWFtIHdhcyByZWFjaGVkLgorICovCitwdWJsaWMgY2xhc3MgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvciBleHRlbmRzIExpbmVSZWFkZXJJbnB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpbmVSZWFkZXJJbnB1dFN0cmVhbSBiaXM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4TGluZUxlbjsKKyAgICAKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlZCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBlb2YgPSBmYWxzZTsKKworICAgIHB1YmxpYyBMaW5lUmVhZGVySW5wdXRTdHJlYW1BZGFwdG9yKAorICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaXMsCisgICAgICAgICAgICBpbnQgbWF4TGluZUxlbikgeworICAgICAgICBzdXBlcihpcyk7CisgICAgICAgIGlmIChpcyBpbnN0YW5jZW9mIExpbmVSZWFkZXJJbnB1dFN0cmVhbSkgeworICAgICAgICAgICAgdGhpcy5iaXMgPSAoTGluZVJlYWRlcklucHV0U3RyZWFtKSBpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuYmlzID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm1heExpbmVMZW4gPSBtYXhMaW5lTGVuOworICAgIH0KKworICAgIHB1YmxpYyBMaW5lUmVhZGVySW5wdXRTdHJlYW1BZGFwdG9yKAorICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaXMpIHsKKyAgICAgICAgdGhpcyhpcywgLTEpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgaSA9IGluLnJlYWQoKTsKKyAgICAgICAgdGhpcy5lb2YgPSBpID09IC0xOworICAgICAgICB0aGlzLnVzZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBpID0gaW4ucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgIHRoaXMuZW9mID0gaSA9PSAtMTsKKyAgICAgICAgdGhpcy51c2VkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZExpbmUoZmluYWwgQnl0ZUFycmF5QnVmZmVyIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGlmICh0aGlzLmJpcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgaSA9IHRoaXMuYmlzLnJlYWRMaW5lKGRzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgaSA9IGRvUmVhZExpbmUoZHN0KTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmVvZiA9IGkgPT0gLTE7CisgICAgICAgIHRoaXMudXNlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGRvUmVhZExpbmUoZmluYWwgQnl0ZUFycmF5QnVmZmVyIGRzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgaW50IGNoOworICAgICAgICB3aGlsZSAoKGNoID0gaW4ucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgZHN0LmFwcGVuZChjaCk7CisgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgaWYgKHRoaXMubWF4TGluZUxlbiA+IDAgJiYgZHN0Lmxlbmd0aCgpID49IHRoaXMubWF4TGluZUxlbikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXhMaW5lTGltaXRFeGNlcHRpb24oIk1heGltdW0gbGluZSBsZW5ndGggbGltaXQgZXhjZWVkZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvdGFsID09IDAgJiYgY2ggPT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBlb2YoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVvZjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVzZWQ7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiW0xpbmVSZWFkZXJJbnB1dFN0cmVhbUFkYXB0b3I6ICIgKyBiaXMgKyAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9NYXhIZWFkZXJMaW1pdEV4Y2VwdGlvbi5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9NYXhIZWFkZXJMaW1pdEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDBjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL01heEhlYWRlckxpbWl0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVFeGNlcHRpb247CisKKy8qKgorICogU2lnbmFscyBhIEkvTyBlcnJvciBkdWUgdG8gdGhlIGhlYWRlciBjb3VudCBleGNlZWRpbmcgdGhlIG1heGltdW0gbGltaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBNYXhIZWFkZXJMaW1pdEV4Y2VwdGlvbiBleHRlbmRzIE1pbWVFeGNlcHRpb24geworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxNTQyNjkwNDUxODYxODY3NjlMOworCisgICAgcHVibGljIE1heEhlYWRlckxpbWl0RXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9NYXhMaW5lTGltaXRFeGNlcHRpb24uamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTWF4TGluZUxpbWl0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzNDc2MAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTWF4TGluZUxpbWl0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pbzsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVJT0V4Y2VwdGlvbjsKKworLyoqCisgKiBTaWduYWxzIGEgSS9PIGVycm9yIGR1ZSB0byBhIGxpbmUgZXhjZWVkaW5nIHRoZSBsaW1pdCBvbiB0aGUgCisgKiBtYXhpbXVtIGxpbmUgbGVuZ3RoLgorICovCitwdWJsaWMgY2xhc3MgTWF4TGluZUxpbWl0RXhjZXB0aW9uIGV4dGVuZHMgTWltZUlPRXhjZXB0aW9uIHsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA4MDM5MDAxMTg3ODM3NzMwNzczTDsKKworICAgIHB1YmxpYyBNYXhMaW5lTGltaXRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL01pbWVCb3VuZGFyeUlucHV0U3RyZWFtLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL01pbWVCb3VuZGFyeUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwMzRjMQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDI5OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW87DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZUFycmF5QnVmZmVyOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KKy8qKg0KKyAqIFN0cmVhbSB0aGF0IGNvbnN0cmFpbnMgaXRzZWxmIHRvIGEgc2luZ2xlIE1JTUUgYm9keSBwYXJ0Lg0KKyAqIEFmdGVyIHRoZSBzdHJlYW0gZW5kcyAoaS5lLiByZWFkKCkgcmV0dXJucyAtMSkge0BsaW5rICNpc0xhc3RQYXJ0KCl9DQorICogY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgZmluYWwgYm91bmRhcnkgaGFzIGJlZW4gc2VlbiBvciBub3QuDQorICovDQorcHVibGljIGNsYXNzIE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtIGV4dGVuZHMgTGluZVJlYWRlcklucHV0U3RyZWFtIHsNCisNCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYm91bmRhcnk7DQorICAgIA0KKyAgICBwcml2YXRlIGJvb2xlYW4gZW9mOw0KKyAgICBwcml2YXRlIGludCBsaW1pdDsNCisgICAgcHJpdmF0ZSBib29sZWFuIGF0Qm91bmRhcnk7DQorICAgIHByaXZhdGUgaW50IGJvdW5kYXJ5TGVuOw0KKyAgICBwcml2YXRlIGJvb2xlYW4gbGFzdFBhcnQ7DQorICAgIHByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZWQ7DQorDQorICAgIHByaXZhdGUgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gYnVmZmVyOw0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBpbmJ1ZmZlciBUaGUgdW5kZXJseWluZyBzdHJlYW0uDQorICAgICAqIEBwYXJhbSBib3VuZGFyeSBCb3VuZGFyeSBzdHJpbmcgKG5vdCBpbmNsdWRpbmcgbGVhZGluZyBoeXBoZW5zKS4NCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiBib3VuZGFyeSBpcyB0b28gbG9uZw0KKyAgICAgKi8NCisgICAgcHVibGljIE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGluYnVmZmVyLCBTdHJpbmcgYm91bmRhcnkpIA0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBzdXBlcihpbmJ1ZmZlcik7DQorICAgICAgICBpZiAoaW5idWZmZXIuY2FwYWNpdHkoKSA8PSBib3VuZGFyeS5sZW5ndGgoKSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJvdW5kYXJ5IGlzIHRvbyBsb25nIik7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLmJ1ZmZlciA9IGluYnVmZmVyOw0KKyAgICAgICAgdGhpcy5lb2YgPSBmYWxzZTsNCisgICAgICAgIHRoaXMubGltaXQgPSAtMTsNCisgICAgICAgIHRoaXMuYXRCb3VuZGFyeSA9IGZhbHNlOw0KKyAgICAgICAgdGhpcy5ib3VuZGFyeUxlbiA9IDA7DQorICAgICAgICB0aGlzLmxhc3RQYXJ0ID0gZmFsc2U7DQorICAgICAgICB0aGlzLmNvbXBsZXRlZCA9IGZhbHNlOw0KKyAgICAgICAgDQorICAgICAgICB0aGlzLmJvdW5kYXJ5ID0gbmV3IGJ5dGVbYm91bmRhcnkubGVuZ3RoKCkgKyAyXTsNCisgICAgICAgIHRoaXMuYm91bmRhcnlbMF0gPSAoYnl0ZSkgJy0nOw0KKyAgICAgICAgdGhpcy5ib3VuZGFyeVsxXSA9IChieXRlKSAnLSc7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJvdW5kYXJ5Lmxlbmd0aCgpOyBpKyspIHsNCisgICAgICAgICAgICBieXRlIGNoID0gKGJ5dGUpIGJvdW5kYXJ5LmNoYXJBdChpKTsNCisgICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSB7DQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJvdW5kYXJ5IG1heSBub3QgY29udGFpbiBDUiBvciBMRiIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICB0aGlzLmJvdW5kYXJ5W2kgKyAyXSA9IGNoOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZmlsbEJ1ZmZlcigpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDbG9zZXMgdGhlIHVuZGVybHlpbmcgc3RyZWFtLg0KKyAgICAgKiANCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBJL08gZXJyb3JzLg0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7DQorICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKCkNCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKGNvbXBsZXRlZCkgew0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlbmRPZlN0cmVhbSgpICYmICFoYXNEYXRhKCkpIHsNCisgICAgICAgICAgICBza2lwQm91bmRhcnkoKTsgICAgICAgICAgICANCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBmb3IgKDs7KSB7DQorICAgICAgICAgICAgaWYgKGhhc0RhdGEoKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyLnJlYWQoKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZE9mU3RyZWFtKCkpIHsNCisgICAgICAgICAgICAgICAgc2tpcEJvdW5kYXJ5KCk7ICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZmlsbEJ1ZmZlcigpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaWYgKGNvbXBsZXRlZCkgew0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChlbmRPZlN0cmVhbSgpICYmICFoYXNEYXRhKCkpIHsNCisgICAgICAgICAgICBza2lwQm91bmRhcnkoKTsgICAgICAgICAgICANCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBmaWxsQnVmZmVyKCk7DQorICAgICAgICBpZiAoIWhhc0RhdGEoKSkgew0KKyAgICAgICAgICAgIHJldHVybiByZWFkKGIsIG9mZiwgbGVuKTsNCisgICAgICAgIH0NCisgICAgICAgIGludCBjaHVuayA9IE1hdGgubWluKGxlbiwgbGltaXQgLSBidWZmZXIucG9zKCkpOw0KKyAgICAgICAgcmV0dXJuIGJ1ZmZlci5yZWFkKGIsIG9mZiwgY2h1bmspOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IHJlYWRMaW5lKGZpbmFsIEJ5dGVBcnJheUJ1ZmZlciBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoZHN0ID09IG51bGwpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEZXN0aW5hdGlvbiBidWZmZXIgbWF5IG5vdCBiZSBudWxsIik7DQorICAgICAgICB9DQorICAgICAgICBpZiAoY29tcGxldGVkKSB7DQorICAgICAgICAgICAgcmV0dXJuIC0xOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKGVuZE9mU3RyZWFtKCkgJiYgIWhhc0RhdGEoKSkgew0KKyAgICAgICAgICAgIHNraXBCb3VuZGFyeSgpOyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0NCisNCisgICAgICAgIGludCB0b3RhbCA9IDA7DQorICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7DQorICAgICAgICBpbnQgYnl0ZXNSZWFkID0gMDsNCisgICAgICAgIHdoaWxlICghZm91bmQpIHsNCisgICAgICAgICAgICBpZiAoIWhhc0RhdGEoKSkgew0KKyAgICAgICAgICAgICAgICBieXRlc1JlYWQgPSBmaWxsQnVmZmVyKCk7DQorICAgICAgICAgICAgICAgIGlmICghaGFzRGF0YSgpICYmIGVuZE9mU3RyZWFtKCkpIHsNCisgICAgICAgICAgICAgICAgICAgIHNraXBCb3VuZGFyeSgpOw0KKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNSZWFkID0gLTE7DQorICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBpbnQgbGVuID0gdGhpcy5saW1pdCAtIHRoaXMuYnVmZmVyLnBvcygpOw0KKyAgICAgICAgICAgIGludCBpID0gdGhpcy5idWZmZXIuaW5kZXhPZigoYnl0ZSknXG4nLCB0aGlzLmJ1ZmZlci5wb3MoKSwgbGVuKTsNCisgICAgICAgICAgICBpbnQgY2h1bms7DQorICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHsNCisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICBjaHVuayA9IGkgKyAxIC0gdGhpcy5idWZmZXIucG9zKCk7DQorICAgICAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICAgICAgY2h1bmsgPSBsZW47DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGlmIChjaHVuayA+IDApIHsNCisgICAgICAgICAgICAgICAgZHN0LmFwcGVuZCh0aGlzLmJ1ZmZlci5idWYoKSwgdGhpcy5idWZmZXIucG9zKCksIGNodW5rKTsNCisgICAgICAgICAgICAgICAgdGhpcy5idWZmZXIuc2tpcChjaHVuayk7DQorICAgICAgICAgICAgICAgIHRvdGFsICs9IGNodW5rOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIGlmICh0b3RhbCA9PSAwICYmIGJ5dGVzUmVhZCA9PSAtMSkgew0KKyAgICAgICAgICAgIHJldHVybiAtMTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIHRvdGFsOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kT2ZTdHJlYW0oKSB7DQorICAgICAgICByZXR1cm4gZW9mIHx8IGF0Qm91bmRhcnk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEYXRhKCkgew0KKyAgICAgICAgcmV0dXJuIGxpbWl0ID4gYnVmZmVyLnBvcygpICYmIGxpbWl0IDw9IGJ1ZmZlci5saW1pdCgpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIGludCBmaWxsQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGlmIChlb2YpIHsNCisgICAgICAgICAgICByZXR1cm4gLTE7DQorICAgICAgICB9DQorICAgICAgICBpbnQgYnl0ZXNSZWFkOw0KKyAgICAgICAgaWYgKCFoYXNEYXRhKCkpIHsNCisgICAgICAgICAgICBieXRlc1JlYWQgPSBidWZmZXIuZmlsbEJ1ZmZlcigpOw0KKyAgICAgICAgfSBlbHNlIHsNCisgICAgICAgICAgICBieXRlc1JlYWQgPSAwOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZW9mID0gYnl0ZXNSZWFkID09IC0xOw0KKyAgICAgICAgDQorICAgICAgICANCisgICAgICAgIGludCBpID0gYnVmZmVyLmluZGV4T2YoYm91bmRhcnkpOw0KKyAgICAgICAgLy8gTk9URSB0aGlzIGN1cnJlbnRseSBjaGVjayBvbmx5IGZvciBMRi4gSXQgZG9lc24ndCBjaGVjayBmb3IgY2Fub25pY2FsIENSTEYNCisgICAgICAgIC8vIGFuZCBuZWl0aGVyIGZvciBpc29sYXRlZCBDUi4gVGhpcyB3aWxsIHJlcXVpcmUgdXBkYXRlcyBhY2NvcmRpbmcgdG8gTUlNRTRKLTYwDQorICAgICAgICB3aGlsZSAoaSA+IDAgJiYgYnVmZmVyLmNoYXJBdChpLTEpICE9ICdcbicpIHsNCisgICAgICAgICAgICAvLyBza2lwIHRoZSAiZmFrZSIgYm91bmRhcnkgKGl0IGRvZXMgbm90IGNvbnRhaW4gTEYgb3IgQ1Igc28gd2UgY2Fubm90IGhhdmUNCisgICAgICAgICAgICAvLyBhbm90aGVyIGJvdW5kYXJ5IHN0YXJ0aW5nIGJlZm9yZSB0aGlzIGlzIGNvbXBsZXRlLg0KKyAgICAgICAgICAgIGkgPSBpICsgYm91bmRhcnkubGVuZ3RoOw0KKyAgICAgICAgICAgIGkgPSBidWZmZXIuaW5kZXhPZihib3VuZGFyeSwgaSwgYnVmZmVyLmxpbWl0KCkgLSBpKTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChpICE9IC0xKSB7DQorICAgICAgICAgICAgbGltaXQgPSBpOw0KKyAgICAgICAgICAgIGF0Qm91bmRhcnkgPSB0cnVlOw0KKyAgICAgICAgICAgIGNhbGN1bGF0ZUJvdW5kYXJ5TGVuKCk7DQorICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgIGlmIChlb2YpIHsNCisgICAgICAgICAgICAgICAgbGltaXQgPSBidWZmZXIubGltaXQoKTsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBsaW1pdCA9IGJ1ZmZlci5saW1pdCgpIC0gKGJvdW5kYXJ5Lmxlbmd0aCArIDEpOyANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBcclxuICsgKGJvdW5kYXJ5IC0gb25lIGNoYXIpDQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZUJvdW5kYXJ5TGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGJvdW5kYXJ5TGVuID0gYm91bmRhcnkubGVuZ3RoOw0KKyAgICAgICAgaW50IGxlbiA9IGxpbWl0IC0gYnVmZmVyLnBvcygpOw0KKyAgICAgICAgaWYgKGxlbiA+IDApIHsNCisgICAgICAgICAgICBpZiAoYnVmZmVyLmNoYXJBdChsaW1pdCAtIDEpID09ICdcbicpIHsNCisgICAgICAgICAgICAgICAgYm91bmRhcnlMZW4rKzsNCisgICAgICAgICAgICAgICAgbGltaXQtLTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBpZiAobGVuID4gMSkgew0KKyAgICAgICAgICAgIGlmIChidWZmZXIuY2hhckF0KGxpbWl0IC0gMSkgPT0gJ1xyJykgew0KKyAgICAgICAgICAgICAgICBib3VuZGFyeUxlbisrOw0KKyAgICAgICAgICAgICAgICBsaW1pdC0tOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSB2b2lkIHNraXBCb3VuZGFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoIWNvbXBsZXRlZCkgew0KKyAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7DQorICAgICAgICAgICAgYnVmZmVyLnNraXAoYm91bmRhcnlMZW4pOw0KKyAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tGb3JMYXN0UGFydCA9IHRydWU7DQorICAgICAgICAgICAgZm9yICg7Oykgew0KKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCgpID4gMSkgew0KKyAgICAgICAgICAgICAgICAgICAgaW50IGNoMSA9IGJ1ZmZlci5jaGFyQXQoYnVmZmVyLnBvcygpKTsNCisgICAgICAgICAgICAgICAgICAgIGludCBjaDIgPSBidWZmZXIuY2hhckF0KGJ1ZmZlci5wb3MoKSArIDEpOw0KKyAgICAgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tGb3JMYXN0UGFydCkgaWYgKGNoMSA9PSAnLScgJiYgY2gyID09ICctJykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFBhcnQgPSB0cnVlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5za2lwKDIpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrRm9yTGFzdFBhcnQgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoMSA9PSAnXHInICYmIGNoMiA9PSAnXG4nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNraXAoMik7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoMSA9PSAnXG4nKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNraXAoMSk7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yaW5nIGV2ZXJ5dGhpbmcgaW4gYSBsaW5lIHN0YXJ0aW5nIHdpdGggYSBib3VuZGFyeS4NCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuc2tpcCgxKTsNCisgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVvZikgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZmlsbEJ1ZmZlcigpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xhc3RQYXJ0KCkgew0KKyAgICAgICAgcmV0dXJuIGxhc3RQYXJ0OyAgICAgICAgDQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBib29sZWFuIGVvZigpIHsNCisgICAgICAgIHJldHVybiBlb2YgJiYgIWJ1ZmZlci5oYXNCdWZmZXJlZERhdGEoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIk1pbWVCb3VuZGFyeUlucHV0U3RyZWFtLCBib3VuZGFyeSAiKTsNCisgICAgICAgIGZvciAoYnl0ZSBiIDogYm91bmRhcnkpIHsNCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKSBiKTsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL1Bvc2l0aW9uSW5wdXRTdHJlYW0uamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vUG9zaXRpb25JbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWY5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL1Bvc2l0aW9uSW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pbzsNCisNCitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCisNCitwdWJsaWMgY2xhc3MgUG9zaXRpb25JbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsNCisNCisgICAgcHJvdGVjdGVkIGxvbmcgcG9zaXRpb24gPSAwOw0KKyAgICBwcml2YXRlIGxvbmcgbWFya2VkUG9zaXRpb24gPSAwOw0KKw0KKyAgICBwdWJsaWMgUG9zaXRpb25JbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgew0KKyAgICAgICAgc3VwZXIoaW5wdXRTdHJlYW0pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBsb25nIGdldFBvc2l0aW9uKCkgew0KKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICByZXR1cm4gaW4uYXZhaWxhYmxlKCk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpbnQgYiA9IGluLnJlYWQoKTsNCisgICAgICAgIGlmIChiICE9IC0xKQ0KKyAgICAgICAgICAgIHBvc2l0aW9uKys7DQorICAgICAgICByZXR1cm4gYjsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaW4uY2xvc2UoKTsNCisgICAgfQ0KKw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgaW4ucmVzZXQoKTsNCisgICAgICAgIHBvc2l0aW9uID0gbWFya2VkUG9zaXRpb247DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7DQorICAgICAgICByZXR1cm4gaW4ubWFya1N1cHBvcnRlZCgpOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkbGltaXQpIHsNCisgICAgICAgIGluLm1hcmsocmVhZGxpbWl0KTsNCisgICAgICAgIG1hcmtlZFBvc2l0aW9uID0gcG9zaXRpb247DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgZmluYWwgbG9uZyBjID0gaW4uc2tpcChuKTsNCisgICAgICAgIGlmIChjID4gMCkgDQorICAgICAgICAgICAgcG9zaXRpb24gKz0gYzsNCisgICAgICAgIHJldHVybiBjOw0KKyAgICB9DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBmaW5hbCBpbnQgYyA9IGluLnJlYWQoYiwgb2ZmLCBsZW4pOw0KKyAgICAgICAgaWYgKGMgPiAwKSANCisgICAgICAgICAgICBwb3NpdGlvbiArPSBjOw0KKyAgICAgICAgcmV0dXJuIGM7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0JpbmFyeUJvZHkuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9CaW5hcnlCb2R5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwZTBmYQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9CaW5hcnlCb2R5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZTsNCisNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCisNCisvKioNCisgKiBBIGJvZHkgY29udGFpbmluZyBiaW5hcnkgZGF0YS4NCisgKi8NCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5Qm9keSBleHRlbmRzIFNpbmdsZUJvZHkgew0KKw0KKyAgICAvKioNCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBCaW5hcnlCb2R5KCkgew0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIGEgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHdoaWNoIHJlYWRzIHRoZSBieXRlcyBvZiB0aGUgYm9keS4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gdGhlIHN0cmVhbSwgdHJhbnNmZXIgZGVjb2RlZA0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uDQorICAgICAqICAgICAgICAgICAgIG9uIEkvTyBlcnJvcnMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYWJzdHJhY3QgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247DQorDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9Cb2R5LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvQm9keS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTgwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvQm9keS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7DQorDQorLyoqDQorICogRW5jYXBzdWxhdGVzIHRoZSBib2R5IG9mIGFuIGVudGl0eSAoc2VlIFJGQyAyMDQ1KS4NCisgKiA8cD4NCisgKiBBIGJvZHkgY2FuIGJlIGEge0BsaW5rIE1lc3NhZ2V9LCBhIHtAbGluayBNdWx0aXBhcnR9IG9yIGEge0BsaW5rIFNpbmdsZUJvZHl9Lg0KKyAqIFRoaXMgaW50ZXJmYWNlIHNob3VsZCBub3QgYmUgaW1wbGVtZW50ZWQgZGlyZWN0bHkgYnkgY2xhc3NlcyBvdGhlciB0aGFuDQorICogdGhvc2UuDQorICovDQorcHVibGljIGludGVyZmFjZSBCb2R5IGV4dGVuZHMgRGlzcG9zYWJsZSB7DQorDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSBwYXJlbnQgb2YgdGhpcyBib2R5Lg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgcGFyZW50Lg0KKyAgICAgKi8NCisgICAgRW50aXR5IGdldFBhcmVudCgpOw0KKw0KKyAgICAvKioNCisgICAgICogU2V0cyB0aGUgcGFyZW50IG9mIHRoaXMgYm9keS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBwYXJlbnQNCisgICAgICogICAgICAgICAgICB0aGUgcGFyZW50Lg0KKyAgICAgKi8NCisgICAgdm9pZCBzZXRQYXJlbnQoRW50aXR5IHBhcmVudCk7DQorDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9Cb2R5Q29waWVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvQm9keUNvcGllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTM0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvQm9keUNvcGllci5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBjb3B5aW5nIG1lc3NhZ2UgYm9kaWVzLgorICovCitwdWJsaWMgY2xhc3MgQm9keUNvcGllciB7CisKKyAgICBwcml2YXRlIEJvZHlDb3BpZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGdpdmVuIHtAbGluayBCb2R5fSB0aGF0IGNhbiBiZSB1c2VkIChhbmQgbW9kaWZpZWQpCisgICAgICogaW5kZXBlbmRlbnRseSBvZiB0aGUgb3JpZ2luYWwuIFRoZSBjb3B5IHNob3VsZCBiZQorICAgICAqIHtAbGluayBEaXNwb3NhYmxlI2Rpc3Bvc2UoKSBkaXNwb3NlZCBvZn0gd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSB7QGxpbmsgQm9keSNnZXRQYXJlbnQoKSBwYXJlbnR9IG9mIHRoZSByZXR1cm5lZCBjb3B5IGlzCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4sIHRoYXQgaXMsIHRoZSBjb3B5IGlzIGRldGFjaGVkIGZyb20gdGhlIHBhcmVudAorICAgICAqIGVudGl0eSBvZiB0aGUgb3JpZ2luYWwuCisgICAgICogCisgICAgICogQHBhcmFtIGJvZHkKKyAgICAgKiAgICAgICAgICAgIGJvZHkgdG8gY29weS4KKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgZ2l2ZW4gYm9keS4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+Ym9keTwvY29kZT4gaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNpbmdsZUJvZHl9CisgICAgICogICAgICAgICAgICAgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSB7QGxpbmsgU2luZ2xlQm9keSNjb3B5KCkgY29weSgpfQorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbiAob3IgY29udGFpbnMgc3VjaCBhIDxjb2RlPlNpbmdsZUJvZHk8L2NvZGU+KS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPmJvZHk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICAgPGNvZGU+Ym9keTwvY29kZT4gaXMgYSA8Y29kZT5Cb2R5PC9jb2RlPiB0aGF0IGlzIG5laXRoZXIKKyAgICAgKiAgICAgICAgICAgICBhIHtAbGluayBNZXNzYWdlfSwge0BsaW5rIE11bHRpcGFydH0gb3Ige0BsaW5rIFNpbmdsZUJvZHl9CisgICAgICogICAgICAgICAgICAgKG9yIGNvbnRhaW5zIHN1Y2ggYSA8Y29kZT5Cb2R5PC9jb2RlPikuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCb2R5IGNvcHkoQm9keSBib2R5KSB7CisgICAgICAgIGlmIChib2R5ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCb2R5IGlzIG51bGwiKTsKKworICAgICAgICBpZiAoYm9keSBpbnN0YW5jZW9mIE1lc3NhZ2UpCisgICAgICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UoKE1lc3NhZ2UpIGJvZHkpOworCisgICAgICAgIGlmIChib2R5IGluc3RhbmNlb2YgTXVsdGlwYXJ0KQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aXBhcnQoKE11bHRpcGFydCkgYm9keSk7CisKKyAgICAgICAgaWYgKGJvZHkgaW5zdGFuY2VvZiBTaW5nbGVCb2R5KQorICAgICAgICAgICAgcmV0dXJuICgoU2luZ2xlQm9keSkgYm9keSkuY29weSgpOworCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGJvZHkgY2xhc3MiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9Cb2R5RmFjdG9yeS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0JvZHlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0ZDNiYQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9Cb2R5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZS5EZWZhdWx0U3RvcmFnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuTXVsdGlSZWZlcmVuY2VTdG9yYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuU3RvcmFnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlLlN0b3JhZ2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNoYXJzZXRVdGlsOworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG1lc3NhZ2UgYm9kaWVzLgorICovCitwdWJsaWMgY2xhc3MgQm9keUZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKEJvZHlGYWN0b3J5LmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJzZXQgRkFMTEJBQ0tfQ0hBUlNFVCA9IENoYXJzZXRVdGlsLkRFRkFVTFRfQ0hBUlNFVDsKKworICAgIHByaXZhdGUgU3RvcmFnZVByb3ZpZGVyIHN0b3JhZ2VQcm92aWRlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Qm9keUZhY3Rvcnk8L2NvZGU+IGluc3RhbmNlIHRoYXQgdXNlcyB0aGUgZGVmYXVsdAorICAgICAqIHN0b3JhZ2UgcHJvdmlkZXIgZm9yIGNyZWF0aW5nIG1lc3NhZ2UgYm9kaWVzIGZyb20gaW5wdXQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm9keUZhY3RvcnkoKSB7CisgICAgICAgIHRoaXMuc3RvcmFnZVByb3ZpZGVyID0gRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Qm9keUZhY3Rvcnk8L2NvZGU+IGluc3RhbmNlIHRoYXQgdXNlcyB0aGUgZ2l2ZW4KKyAgICAgKiBzdG9yYWdlIHByb3ZpZGVyIGZvciBjcmVhdGluZyBtZXNzYWdlIGJvZGllcyBmcm9tIGlucHV0IHN0cmVhbXMuCisgICAgICogCisgICAgICogQHBhcmFtIHN0b3JhZ2VQcm92aWRlcgorICAgICAqICAgICAgICAgICAgYSBzdG9yYWdlIHByb3ZpZGVyIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgZGVmYXVsdAorICAgICAqICAgICAgICAgICAgb25lLgorICAgICAqLworICAgIHB1YmxpYyBCb2R5RmFjdG9yeShTdG9yYWdlUHJvdmlkZXIgc3RvcmFnZVByb3ZpZGVyKSB7CisgICAgICAgIGlmIChzdG9yYWdlUHJvdmlkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHN0b3JhZ2VQcm92aWRlciA9IERlZmF1bHRTdG9yYWdlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICB0aGlzLnN0b3JhZ2VQcm92aWRlciA9IHN0b3JhZ2VQcm92aWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5TdG9yYWdlUHJvdmlkZXI8L2NvZGU+IHRoaXMgPGNvZGU+Qm9keUZhY3Rvcnk8L2NvZGU+CisgICAgICogdXNlcyB0byBjcmVhdGUgbWVzc2FnZSBib2RpZXMgZnJvbSBpbnB1dCBzdHJlYW1zLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSA8Y29kZT5TdG9yYWdlUHJvdmlkZXI8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBTdG9yYWdlUHJvdmlkZXIgZ2V0U3RvcmFnZVByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gc3RvcmFnZVByb3ZpZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQmluYXJ5Qm9keX0gdGhhdCBob2xkcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gaW5wdXQKKyAgICAgKiBzdHJlYW0uCisgICAgICogCisgICAgICogQHBhcmFtIGlzCisgICAgICogICAgICAgICAgICBpbnB1dCBzdHJlYW0gdG8gY3JlYXRlIGEgbWVzc2FnZSBib2R5IGZyb20uCisgICAgICogQHJldHVybiBhIGJpbmFyeSBib2R5LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBCaW5hcnlCb2R5IGJpbmFyeUJvZHkoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIFN0b3JhZ2Ugc3RvcmFnZSA9IHN0b3JhZ2VQcm92aWRlci5zdG9yZShpcyk7CisgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUJpbmFyeUJvZHkobmV3IE11bHRpUmVmZXJlbmNlU3RvcmFnZShzdG9yYWdlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBCaW5hcnlCb2R5fSB0aGF0IGhvbGRzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBTdG9yYWdlfS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciBtdXN0IG5vdCBpbnZva2Uge0BsaW5rIFN0b3JhZ2UjZGVsZXRlKCkgZGVsZXRlKCl9IG9uCisgICAgICogdGhlIGdpdmVuIDxjb2RlPlN0b3JhZ2U8L2NvZGU+IG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBwYXNzZWQgdG8gdGhpcworICAgICAqIG1ldGhvZC4gSW5zdGVhZCB0aGUgbWVzc2FnZSBib2R5IGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QgdGFrZXMgY2FyZSBvZgorICAgICAqIGRlbGV0aW5nIHRoZSBzdG9yYWdlIHdoZW4gaXQgZ2V0cyBkaXNwb3NlZCBvZiAoc2VlCisgICAgICoge0BsaW5rIERpc3Bvc2FibGUjZGlzcG9zZSgpfSkuCisgICAgICogCisgICAgICogQHBhcmFtIHN0b3JhZ2UKKyAgICAgKiAgICAgICAgICAgIHN0b3JhZ2UgdG8gY3JlYXRlIGEgbWVzc2FnZSBib2R5IGZyb20uCisgICAgICogQHJldHVybiBhIGJpbmFyeSBib2R5LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBCaW5hcnlCb2R5IGJpbmFyeUJvZHkoU3RvcmFnZSBzdG9yYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoc3RvcmFnZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZUJpbmFyeUJvZHkobmV3IE11bHRpUmVmZXJlbmNlU3RvcmFnZShzdG9yYWdlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBUZXh0Qm9keX0gdGhhdCBob2xkcyB0aGUgY29udGVudCBvZiB0aGUgZ2l2ZW4gaW5wdXQKKyAgICAgKiBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogJnF1b3Q7dXMtYXNjaWkmcXVvdDsgaXMgdXNlZCB0byBkZWNvZGUgdGhlIGJ5dGUgY29udGVudCBvZiB0aGUKKyAgICAgKiA8Y29kZT5TdG9yYWdlPC9jb2RlPiBpbnRvIGEgY2hhcmFjdGVyIHN0cmVhbSB3aGVuIGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgVGV4dEJvZHkjZ2V0UmVhZGVyKCkgZ2V0UmVhZGVyKCl9IG9uIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgICogCisgICAgICogQHBhcmFtIGlzCisgICAgICogICAgICAgICAgICBpbnB1dCBzdHJlYW0gdG8gY3JlYXRlIGEgbWVzc2FnZSBib2R5IGZyb20uCisgICAgICogQHJldHVybiBhIHRleHQgYm9keS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGV4dEJvZHkgdGV4dEJvZHkoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIFN0b3JhZ2Ugc3RvcmFnZSA9IHN0b3JhZ2VQcm92aWRlci5zdG9yZShpcyk7CisgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZVRleHRCb2R5KG5ldyBNdWx0aVJlZmVyZW5jZVN0b3JhZ2Uoc3RvcmFnZSksCisgICAgICAgICAgICAgICAgQ2hhcnNldFV0aWwuREVGQVVMVF9DSEFSU0VUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHRCb2R5fSB0aGF0IGhvbGRzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBpbnB1dAorICAgICAqIHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2hhcnNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBNSU1FIGNoYXJzZXQgbmFtZSBpcyB1c2VkIHRvCisgICAgICogZGVjb2RlIHRoZSBieXRlIGNvbnRlbnQgb2YgdGhlIGlucHV0IHN0cmVhbSBpbnRvIGEgY2hhcmFjdGVyIHN0cmVhbSB3aGVuCisgICAgICogY2FsbGluZyB7QGxpbmsgVGV4dEJvZHkjZ2V0UmVhZGVyKCkgZ2V0UmVhZGVyKCl9IG9uIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgICogSWYgdGhlIE1JTUUgY2hhcnNldCBoYXMgbm8gY29ycmVzcG9uZGluZyBKYXZhIGNoYXJzZXQgb3IgdGhlIEphdmEgY2hhcnNldAorICAgICAqIGNhbm5vdCBiZSB1c2VkIGZvciBkZWNvZGluZyB0aGVuICZxdW90O3VzLWFzY2lpJnF1b3Q7IGlzIHVzZWQgaW5zdGVhZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXMKKyAgICAgKiAgICAgICAgICAgIGlucHV0IHN0cmVhbSB0byBjcmVhdGUgYSBtZXNzYWdlIGJvZHkgZnJvbS4KKyAgICAgKiBAcGFyYW0gbWltZUNoYXJzZXQKKyAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgYSBNSU1FIGNoYXJzZXQuCisgICAgICogQHJldHVybiBhIHRleHQgYm9keS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGV4dEJvZHkgdGV4dEJvZHkoSW5wdXRTdHJlYW0gaXMsIFN0cmluZyBtaW1lQ2hhcnNldCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBpZiAobWltZUNoYXJzZXQgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICBTdG9yYWdlIHN0b3JhZ2UgPSBzdG9yYWdlUHJvdmlkZXIuc3RvcmUoaXMpOworICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSB0b0phdmFDaGFyc2V0KG1pbWVDaGFyc2V0LCBmYWxzZSk7CisgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZVRleHRCb2R5KG5ldyBNdWx0aVJlZmVyZW5jZVN0b3JhZ2Uoc3RvcmFnZSksIGNoYXJzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEJvZHl9IHRoYXQgaG9sZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuCisgICAgICoge0BsaW5rIFN0b3JhZ2V9LgorICAgICAqIDxwPgorICAgICAqICZxdW90O3VzLWFzY2lpJnF1b3Q7IGlzIHVzZWQgdG8gZGVjb2RlIHRoZSBieXRlIGNvbnRlbnQgb2YgdGhlCisgICAgICogPGNvZGU+U3RvcmFnZTwvY29kZT4gaW50byBhIGNoYXJhY3RlciBzdHJlYW0gd2hlbiBjYWxsaW5nCisgICAgICoge0BsaW5rIFRleHRCb2R5I2dldFJlYWRlcigpIGdldFJlYWRlcigpfSBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgY2FsbGVyIG11c3Qgbm90IGludm9rZSB7QGxpbmsgU3RvcmFnZSNkZWxldGUoKSBkZWxldGUoKX0gb24KKyAgICAgKiB0aGUgZ2l2ZW4gPGNvZGU+U3RvcmFnZTwvY29kZT4gb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIHBhc3NlZCB0byB0aGlzCisgICAgICogbWV0aG9kLiBJbnN0ZWFkIHRoZSBtZXNzYWdlIGJvZHkgY3JlYXRlZCBieSB0aGlzIG1ldGhvZCB0YWtlcyBjYXJlIG9mCisgICAgICogZGVsZXRpbmcgdGhlIHN0b3JhZ2Ugd2hlbiBpdCBnZXRzIGRpc3Bvc2VkIG9mIChzZWUKKyAgICAgKiB7QGxpbmsgRGlzcG9zYWJsZSNkaXNwb3NlKCl9KS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RvcmFnZQorICAgICAqICAgICAgICAgICAgc3RvcmFnZSB0byBjcmVhdGUgYSBtZXNzYWdlIGJvZHkgZnJvbS4KKyAgICAgKiBAcmV0dXJuIGEgdGV4dCBib2R5LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBUZXh0Qm9keSB0ZXh0Qm9keShTdG9yYWdlIHN0b3JhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChzdG9yYWdlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlVGV4dEJvZHkobmV3IE11bHRpUmVmZXJlbmNlU3RvcmFnZShzdG9yYWdlKSwKKyAgICAgICAgICAgICAgICBDaGFyc2V0VXRpbC5ERUZBVUxUX0NIQVJTRVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgVGV4dEJvZHl9IHRoYXQgaG9sZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuCisgICAgICoge0BsaW5rIFN0b3JhZ2V9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaGFyc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIE1JTUUgY2hhcnNldCBuYW1lIGlzIHVzZWQgdG8KKyAgICAgKiBkZWNvZGUgdGhlIGJ5dGUgY29udGVudCBvZiB0aGUgPGNvZGU+U3RvcmFnZTwvY29kZT4gaW50byBhIGNoYXJhY3RlcgorICAgICAqIHN0cmVhbSB3aGVuIGNhbGxpbmcge0BsaW5rIFRleHRCb2R5I2dldFJlYWRlcigpIGdldFJlYWRlcigpfSBvbiB0aGUKKyAgICAgKiByZXR1cm5lZCBvYmplY3QuIElmIHRoZSBNSU1FIGNoYXJzZXQgaGFzIG5vIGNvcnJlc3BvbmRpbmcgSmF2YSBjaGFyc2V0IG9yCisgICAgICogdGhlIEphdmEgY2hhcnNldCBjYW5ub3QgYmUgdXNlZCBmb3IgZGVjb2RpbmcgdGhlbiAmcXVvdDt1cy1hc2NpaSZxdW90OyBpcworICAgICAqIHVzZWQgaW5zdGVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIGNhbGxlciBtdXN0IG5vdCBpbnZva2Uge0BsaW5rIFN0b3JhZ2UjZGVsZXRlKCkgZGVsZXRlKCl9IG9uCisgICAgICogdGhlIGdpdmVuIDxjb2RlPlN0b3JhZ2U8L2NvZGU+IG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBwYXNzZWQgdG8gdGhpcworICAgICAqIG1ldGhvZC4gSW5zdGVhZCB0aGUgbWVzc2FnZSBib2R5IGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QgdGFrZXMgY2FyZSBvZgorICAgICAqIGRlbGV0aW5nIHRoZSBzdG9yYWdlIHdoZW4gaXQgZ2V0cyBkaXNwb3NlZCBvZiAoc2VlCisgICAgICoge0BsaW5rIERpc3Bvc2FibGUjZGlzcG9zZSgpfSkuCisgICAgICogCisgICAgICogQHBhcmFtIHN0b3JhZ2UKKyAgICAgKiAgICAgICAgICAgIHN0b3JhZ2UgdG8gY3JlYXRlIGEgbWVzc2FnZSBib2R5IGZyb20uCisgICAgICogQHBhcmFtIG1pbWVDaGFyc2V0CisgICAgICogICAgICAgICAgICBuYW1lIG9mIGEgTUlNRSBjaGFyc2V0LgorICAgICAqIEByZXR1cm4gYSB0ZXh0IGJvZHkuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIFRleHRCb2R5IHRleHRCb2R5KFN0b3JhZ2Ugc3RvcmFnZSwgU3RyaW5nIG1pbWVDaGFyc2V0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0b3JhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKG1pbWVDaGFyc2V0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gdG9KYXZhQ2hhcnNldChtaW1lQ2hhcnNldCwgZmFsc2UpOworICAgICAgICByZXR1cm4gbmV3IFN0b3JhZ2VUZXh0Qm9keShuZXcgTXVsdGlSZWZlcmVuY2VTdG9yYWdlKHN0b3JhZ2UpLCBjaGFyc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHRCb2R5fSB0aGF0IGhvbGRzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICogPHA+CisgICAgICogJnF1b3Q7dXMtYXNjaWkmcXVvdDsgaXMgdXNlZCB0byBlbmNvZGUgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZyBpbnRvCisgICAgICogYSBieXRlIHN0cmVhbSB3aGVuIGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgU2luZ2xlQm9keSN3cml0ZVRvKGphdmEuaW8uT3V0cHV0U3RyZWFtKSB3cml0ZVRvKE91dHB1dFN0cmVhbSl9IG9uCisgICAgICogdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dAorICAgICAqICAgICAgICAgICAgdGV4dCB0byBjcmVhdGUgYSBtZXNzYWdlIGJvZHkgZnJvbS4KKyAgICAgKiBAcmV0dXJuIGEgdGV4dCBib2R5LgorICAgICAqLworICAgIHB1YmxpYyBUZXh0Qm9keSB0ZXh0Qm9keShTdHJpbmcgdGV4dCkgeworICAgICAgICBpZiAodGV4dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nVGV4dEJvZHkodGV4dCwgQ2hhcnNldFV0aWwuREVGQVVMVF9DSEFSU0VUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFRleHRCb2R5fSB0aGF0IGhvbGRzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBzdHJpbmcuCisgICAgICogPHA+CisgICAgICogVGhlIGNoYXJzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gTUlNRSBjaGFyc2V0IG5hbWUgaXMgdXNlZCB0bworICAgICAqIGVuY29kZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgc3RyaW5nIGludG8gYSBieXRlIHN0cmVhbSB3aGVuIGNhbGxpbmcKKyAgICAgKiB7QGxpbmsgU2luZ2xlQm9keSN3cml0ZVRvKGphdmEuaW8uT3V0cHV0U3RyZWFtKSB3cml0ZVRvKE91dHB1dFN0cmVhbSl9IG9uCisgICAgICogdGhlIHJldHVybmVkIG9iamVjdC4gSWYgdGhlIE1JTUUgY2hhcnNldCBoYXMgbm8gY29ycmVzcG9uZGluZyBKYXZhCisgICAgICogY2hhcnNldCBvciB0aGUgSmF2YSBjaGFyc2V0IGNhbm5vdCBiZSB1c2VkIGZvciBlbmNvZGluZyB0aGVuCisgICAgICogJnF1b3Q7dXMtYXNjaWkmcXVvdDsgaXMgdXNlZCBpbnN0ZWFkLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0ZXh0CisgICAgICogICAgICAgICAgICB0ZXh0IHRvIGNyZWF0ZSBhIG1lc3NhZ2UgYm9keSBmcm9tLgorICAgICAqIEBwYXJhbSBtaW1lQ2hhcnNldAorICAgICAqICAgICAgICAgICAgbmFtZSBvZiBhIE1JTUUgY2hhcnNldC4KKyAgICAgKiBAcmV0dXJuIGEgdGV4dCBib2R5LgorICAgICAqLworICAgIHB1YmxpYyBUZXh0Qm9keSB0ZXh0Qm9keShTdHJpbmcgdGV4dCwgU3RyaW5nIG1pbWVDaGFyc2V0KSB7CisgICAgICAgIGlmICh0ZXh0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChtaW1lQ2hhcnNldCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIENoYXJzZXQgY2hhcnNldCA9IHRvSmF2YUNoYXJzZXQobWltZUNoYXJzZXQsIHRydWUpOworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1RleHRCb2R5KHRleHQsIGNoYXJzZXQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENoYXJzZXQgdG9KYXZhQ2hhcnNldChTdHJpbmcgbWltZUNoYXJzZXQsIGJvb2xlYW4gZm9yRW5jb2RpbmcpIHsKKyAgICAgICAgU3RyaW5nIGNoYXJzZXQgPSBDaGFyc2V0VXRpbC50b0phdmFDaGFyc2V0KG1pbWVDaGFyc2V0KTsKKyAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIk1JTUUgY2hhcnNldCAnIiArIG1pbWVDaGFyc2V0ICsgIicgaGFzIG5vICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImNvcnJlc3BvbmRpbmcgSmF2YSBjaGFyc2V0LiBVc2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICArIEZBTExCQUNLX0NIQVJTRVQgKyAiIGluc3RlYWQuIik7CisgICAgICAgICAgICByZXR1cm4gRkFMTEJBQ0tfQ0hBUlNFVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JFbmNvZGluZyAmJiAhQ2hhcnNldFV0aWwuaXNFbmNvZGluZ1N1cHBvcnRlZChjaGFyc2V0KSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIk1JTUUgY2hhcnNldCAnIiArIG1pbWVDaGFyc2V0CisgICAgICAgICAgICAgICAgICAgICAgICArICInIGRvZXMgbm90IHN1cHBvcnQgZW5jb2RpbmcuIFVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgRkFMTEJBQ0tfQ0hBUlNFVCArICIgaW5zdGVhZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxMQkFDS19DSEFSU0VUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3JFbmNvZGluZyAmJiAhQ2hhcnNldFV0aWwuaXNEZWNvZGluZ1N1cHBvcnRlZChjaGFyc2V0KSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc1dhcm5FbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nLndhcm4oIk1JTUUgY2hhcnNldCAnIiArIG1pbWVDaGFyc2V0CisgICAgICAgICAgICAgICAgICAgICAgICArICInIGRvZXMgbm90IHN1cHBvcnQgZGVjb2RpbmcuIFVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgRkFMTEJBQ0tfQ0hBUlNFVCArICIgaW5zdGVhZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxMQkFDS19DSEFSU0VUOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENoYXJzZXQuZm9yTmFtZShjaGFyc2V0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9Cb2R5UGFydC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0JvZHlQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5ZGQwNgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9Cb2R5UGFydC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7DQorDQorLyoqDQorICogUmVwcmVzZW50cyBhIE1JTUUgYm9keSBwYXJ0ICAoc2VlIFJGQyAyMDQ1KS4NCisgKi8NCitwdWJsaWMgY2xhc3MgQm9keVBhcnQgZXh0ZW5kcyBFbnRpdHkgew0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBlbXB0eSA8Y29kZT5Cb2R5UGFydDwvY29kZT4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgQm9keVBhcnQoKSB7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Qm9keVBhcnQ8L2NvZGU+IGZyb20gdGhlIHNwZWNpZmllZA0KKyAgICAgKiA8Y29kZT5Cb2R5UGFydDwvY29kZT4uIFRoZSA8Y29kZT5Cb2R5UGFydDwvY29kZT4gaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQNCisgICAgICogd2l0aCBjb3BpZXMgb2YgaGVhZGVyIGFuZCBib2R5IG9mIHRoZSBzcGVjaWZpZWQgPGNvZGU+Qm9keVBhcnQ8L2NvZGU+Lg0KKyAgICAgKiBUaGUgcGFyZW50IGVudGl0eSBvZiB0aGUgbmV3IGJvZHkgcGFydCBpcyA8Y29kZT5udWxsPC9jb2RlPi4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBvdGhlcg0KKyAgICAgKiAgICAgICAgICAgIGJvZHkgcGFydCB0byBjb3B5Lg0KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPm90aGVyPC9jb2RlPiBjb250YWlucyBhIHtAbGluayBTaW5nbGVCb2R5fSB0aGF0DQorICAgICAqICAgICAgICAgICAgIGRvZXMgbm90IHN1cHBvcnQgdGhlIHtAbGluayBTaW5nbGVCb2R5I2NvcHkoKSBjb3B5KCl9DQorICAgICAqICAgICAgICAgICAgIG9wZXJhdGlvbi4NCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+b3RoZXI8L2NvZGU+IGNvbnRhaW5zIGEgPGNvZGU+Qm9keTwvY29kZT4gdGhhdA0KKyAgICAgKiAgICAgICAgICAgICBpcyBuZWl0aGVyIGEge0BsaW5rIE1lc3NhZ2V9LCB7QGxpbmsgTXVsdGlwYXJ0fSBvcg0KKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgU2luZ2xlQm9keX0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgQm9keVBhcnQoQm9keVBhcnQgb3RoZXIpIHsNCisgICAgICAgIHN1cGVyKG90aGVyKTsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvRGlzcG9zYWJsZS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0Rpc3Bvc2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmM1NjE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0Rpc3Bvc2FibGUuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKKy8qKgorICogQSA8dHQ+RGlzcG9zYWJsZTwvdHQ+IGlzIGFuIG9iamVjdCB0aGF0IHNob3VsZCBiZSBkaXNwb3NlZCBvZiBleHBsaWNpdGx5CisgKiB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisgKiAKKyAqIFRoZSBkaXNwb3NlIG1ldGhvZCBpcyBpbnZva2VkIHRvIHJlbGVhc2UgcmVzb3VyY2VzIHRoYXQgdGhlIG9iamVjdCBpcworICogaG9sZGluZyAoc3VjaCBhcyBvcGVuIGZpbGVzKS4gCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGlzcG9zYWJsZSB7CisgICAgLyoqCisgICAgICogRnJlZSBhbnkgcmVzb3VyY2VzIHRoaXMgb2JqZWN0IGlzIGhvbGRpbmcgYW5kIHByZXBhcmVzIHRoaXMgb2JqZWN0CisgICAgICogZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gT25jZSBhbiBvYmplY3QgaGFzIGJlZW4gZGlzcG9zZWQgb2YgaXQgY2FuIG5vCisgICAgICogbG9uZ2VyIGJlIHVzZWQuCisgICAgICovCisgICAgdm9pZCBkaXNwb3NlKCk7Cit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvRW50aXR5LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhMTJkNAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9FbnRpdHkuamF2YQpAQCAtMCwwICsxLDU1NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5Db250ZW50RGlzcG9zaXRpb25GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5Db250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkNvbnRlbnRUeXBlRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuRmllbGROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkZpZWxkczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5NaW1lVXRpbDsKKworLyoqCisgKiBNSU1FIGVudGl0eS4gQW4gZW50aXR5IGhhcyBhIGhlYWRlciBhbmQgYSBib2R5IChzZWUgUkZDIDIwNDUpLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW50aXR5IGltcGxlbWVudHMgRGlzcG9zYWJsZSB7CisgICAgcHJpdmF0ZSBIZWFkZXIgaGVhZGVyID0gbnVsbDsKKyAgICBwcml2YXRlIEJvZHkgYm9keSA9IG51bGw7CisgICAgcHJpdmF0ZSBFbnRpdHkgcGFyZW50ID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5PC9jb2RlPi4gVHlwaWNhbGx5IGludm9rZWQgaW1wbGljaXRseSBieSBhCisgICAgICogc3ViY2xhc3MgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIEVudGl0eSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eTwvY29kZT4gZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+RW50aXR5PC9jb2RlPi4gVGhlIDxjb2RlPkVudGl0eTwvY29kZT4gaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQKKyAgICAgKiB3aXRoIGNvcGllcyBvZiBoZWFkZXIgYW5kIGJvZHkgb2YgdGhlIHNwZWNpZmllZCA8Y29kZT5FbnRpdHk8L2NvZGU+LgorICAgICAqIFRoZSBwYXJlbnQgZW50aXR5IG9mIHRoZSBuZXcgZW50aXR5IGlzIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBvdGhlcgorICAgICAqICAgICAgICAgICAgZW50aXR5IHRvIGNvcHkuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPm90aGVyPC9jb2RlPiBjb250YWlucyBhIHtAbGluayBTaW5nbGVCb2R5fSB0aGF0CisgICAgICogICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCB0aGUge0BsaW5rIFNpbmdsZUJvZHkjY29weSgpIGNvcHkoKX0KKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vdGhlcjwvY29kZT4gY29udGFpbnMgYSA8Y29kZT5Cb2R5PC9jb2RlPiB0aGF0CisgICAgICogICAgICAgICAgICAgaXMgbmVpdGhlciBhIHtAbGluayBNZXNzYWdlfSwge0BsaW5rIE11bHRpcGFydH0gb3IKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgU2luZ2xlQm9keX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIEVudGl0eShFbnRpdHkgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyLmhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBuZXcgSGVhZGVyKG90aGVyLmhlYWRlcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3RoZXIuYm9keSAhPSBudWxsKSB7CisgICAgICAgICAgICBCb2R5IGJvZHlDb3B5ID0gQm9keUNvcGllci5jb3B5KG90aGVyLmJvZHkpOworICAgICAgICAgICAgc2V0Qm9keShib2R5Q29weSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwYXJlbnQgZW50aXR5IG9mIHRoaXMgZW50aXR5LgorICAgICAqIFJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyB0aGUgcm9vdCBlbnRpdHkuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgcGFyZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHkgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXJlbnQgZW50aXR5IG9mIHRoaXMgZW50aXR5LgorICAgICAqIAorICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBlbnRpdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiAgICAgICAgdGhpcyB3aWxsIGJlIHRoZSByb290IGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoRW50aXR5IHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZW50aXR5IGhlYWRlci4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIEhlYWRlciBnZXRIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBoZWFkZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGVudGl0eSBoZWFkZXIuCisgICAgICogCisgICAgICogQHBhcmFtIGhlYWRlciB0aGUgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihIZWFkZXIgaGVhZGVyKSB7CisgICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBib2R5IG9mIHRoaXMgZW50aXR5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGJvZHksCisgICAgICovCisgICAgcHVibGljIEJvZHkgZ2V0Qm9keSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIGVudGl0eS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYm9keSB0aGUgYm9keS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgYm9keSBoYXMgYWxyZWFkeSBiZWVuIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb2R5KEJvZHkgYm9keSkgeworICAgICAgICBpZiAodGhpcy5ib2R5ICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2R5IGFscmVhZHkgc2V0Iik7CisKKyAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICAgICAgYm9keS5zZXRQYXJlbnQodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgYm9keSBvZiB0aGlzIGVudGl0eS4gVGhlIHJlbW92ZWQgYm9keSBtYXkgYmUKKyAgICAgKiBhdHRhY2hlZCB0byBhbm90aGVyIGVudGl0eS4gSWYgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpdCBzaG91bGQgYmUKKyAgICAgKiB7QGxpbmsgRGlzcG9zYWJsZSNkaXNwb3NlKCkgZGlzcG9zZWR9IG9mLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHJlbW92ZWQgYm9keSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBib2R5IHdhcyBzZXQuCisgICAgICovCisgICAgcHVibGljIEJvZHkgcmVtb3ZlQm9keSgpIHsKKyAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEJvZHkgYm9keSA9IHRoaXMuYm9keTsKKyAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDsKKyAgICAgICAgYm9keS5zZXRQYXJlbnQobnVsbCk7CisKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXMgYm9keSBvZiB0aGlzIGVudGl0eSBhbmQgdGhlIGNvbnRlbnQgdHlwZSB0bworICAgICAqICZxdW90O21lc3NhZ2UvcmZjODIyJnF1b3Q7LiBBIDxjb2RlPkhlYWRlcjwvY29kZT4gaXMgY3JlYXRlZCBpZiB0aGlzCisgICAgICogZW50aXR5IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmUuCisgICAgICogCisgICAgICogQHBhcmFtIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIHNldCBhcyBib2R5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIHNldEJvZHkobWVzc2FnZSwgIm1lc3NhZ2UvcmZjODIyIiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIG11bHRpcGFydCBhcyBib2R5IG9mIHRoaXMgZW50aXR5LiBBbHNvIHNldHMgdGhlCisgICAgICogY29udGVudCB0eXBlIGFjY29yZGluZ2x5IGFuZCBjcmVhdGVzIGEgbWVzc2FnZSBib3VuZGFyeSBzdHJpbmcuIEEKKyAgICAgKiA8Y29kZT5IZWFkZXI8L2NvZGU+IGlzIGNyZWF0ZWQgaWYgdGhpcyBlbnRpdHkgZG9lcyBub3QgYWxyZWFkeSBoYXZlCisgICAgICogb25lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtdWx0aXBhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBtdWx0aXBhcnQgdG8gc2V0IGFzIGJvZHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGlwYXJ0KE11bHRpcGFydCBtdWx0aXBhcnQpIHsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gIm11bHRpcGFydC8iICsgbXVsdGlwYXJ0LmdldFN1YlR5cGUoKTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKCJib3VuZGFyeSIsCisgICAgICAgICAgICAgICAgTWltZVV0aWwuY3JlYXRlVW5pcXVlQm91bmRhcnkoKSk7CisKKyAgICAgICAgc2V0Qm9keShtdWx0aXBhcnQsIG1pbWVUeXBlLCBwYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgbXVsdGlwYXJ0IGFzIGJvZHkgb2YgdGhpcyBlbnRpdHkuIEFsc28gc2V0cyB0aGUKKyAgICAgKiBjb250ZW50IHR5cGUgYWNjb3JkaW5nbHkgYW5kIGNyZWF0ZXMgYSBtZXNzYWdlIGJvdW5kYXJ5IHN0cmluZy4gQQorICAgICAqIDxjb2RlPkhlYWRlcjwvY29kZT4gaXMgY3JlYXRlZCBpZiB0aGlzIGVudGl0eSBkb2VzIG5vdCBhbHJlYWR5IGhhdmUKKyAgICAgKiBvbmUuCisgICAgICogCisgICAgICogQHBhcmFtIG11bHRpcGFydAorICAgICAqICAgICAgICAgICAgdGhlIG11bHRpcGFydCB0byBzZXQgYXMgYm9keS4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNdWx0aXBhcnQoTXVsdGlwYXJ0IG11bHRpcGFydCwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9ICJtdWx0aXBhcnQvIiArIG11bHRpcGFydC5nZXRTdWJUeXBlKCk7CisgICAgICAgIGlmICghcGFyYW1ldGVycy5jb250YWluc0tleSgiYm91bmRhcnkiKSkgeworICAgICAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPihwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KCJib3VuZGFyeSIsIE1pbWVVdGlsLmNyZWF0ZVVuaXF1ZUJvdW5kYXJ5KCkpOworICAgICAgICB9CisKKyAgICAgICAgc2V0Qm9keShtdWx0aXBhcnQsIG1pbWVUeXBlLCBwYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBzcGVjaWZpZWQgPGNvZGU+VGV4dEJvZHk8L2NvZGU+IGFzIGJvZHkgb2YgdGhpcyBlbnRpdHkgYW5kIHRoZQorICAgICAqIGNvbnRlbnQgdHlwZSB0byAmcXVvdDt0ZXh0L3BsYWluJnF1b3Q7LiBBIDxjb2RlPkhlYWRlcjwvY29kZT4gaXMKKyAgICAgKiBjcmVhdGVkIGlmIHRoaXMgZW50aXR5IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBvbmUuCisgICAgICogCisgICAgICogQHBhcmFtIHRleHRCb2R5CisgICAgICogICAgICAgICAgICB0aGUgPGNvZGU+VGV4dEJvZHk8L2NvZGU+IHRvIHNldCBhcyBib2R5LgorICAgICAqIEBzZWUgQm9keUZhY3RvcnkjdGV4dEJvZHkoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRleHQoVGV4dEJvZHkgdGV4dEJvZHkpIHsKKyAgICAgICAgc2V0VGV4dCh0ZXh0Qm9keSwgInBsYWluIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc3BlY2lmaWVkIDxjb2RlPlRleHRCb2R5PC9jb2RlPiBhcyBib2R5IG9mIHRoaXMgZW50aXR5LiBBbHNvCisgICAgICogc2V0cyB0aGUgY29udGVudCB0eXBlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHN1Yi10eXBlLiBBCisgICAgICogPGNvZGU+SGVhZGVyPC9jb2RlPiBpcyBjcmVhdGVkIGlmIHRoaXMgZW50aXR5IGRvZXMgbm90IGFscmVhZHkgaGF2ZQorICAgICAqIG9uZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdGV4dEJvZHkKKyAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5UZXh0Qm9keTwvY29kZT4gdG8gc2V0IGFzIGJvZHkuCisgICAgICogQHBhcmFtIHN1YnR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0ZXh0IHN1YnR5cGUgKGUuZy4gJnF1b3Q7cGxhaW4mcXVvdDssICZxdW90O2h0bWwmcXVvdDsgb3IKKyAgICAgKiAgICAgICAgICAgICZxdW90O3htbCZxdW90OykuCisgICAgICogQHNlZSBCb2R5RmFjdG9yeSN0ZXh0Qm9keShTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChUZXh0Qm9keSB0ZXh0Qm9keSwgU3RyaW5nIHN1YnR5cGUpIHsKKyAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gInRleHQvIiArIHN1YnR5cGU7CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG1pbWVDaGFyc2V0ID0gdGV4dEJvZHkuZ2V0TWltZUNoYXJzZXQoKTsKKyAgICAgICAgaWYgKG1pbWVDaGFyc2V0ICE9IG51bGwgJiYgIW1pbWVDaGFyc2V0LmVxdWFsc0lnbm9yZUNhc2UoInVzLWFzY2lpIikpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoImNoYXJzZXQiLCBtaW1lQ2hhcnNldCk7CisgICAgICAgIH0KKworICAgICAgICBzZXRCb2R5KHRleHRCb2R5LCBtaW1lVHlwZSwgcGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYm9keSBvZiB0aGlzIGVudGl0eSBhbmQgc2V0cyB0aGUgY29udGVudC10eXBlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiB2YWx1ZS4gQSA8Y29kZT5IZWFkZXI8L2NvZGU+IGlzIGNyZWF0ZWQgaWYgdGhpcyBlbnRpdHkgZG9lcyBub3QgYWxyZWFkeQorICAgICAqIGhhdmUgb25lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBib2R5CisgICAgICogICAgICAgICAgICB0aGUgYm9keS4KKyAgICAgKiBAcGFyYW0gbWltZVR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBNSU1FIG1lZGlhIHR5cGUgb2YgdGhlIHNwZWNpZmllZCBib2R5CisgICAgICogICAgICAgICAgICAoJnF1b3Q7dHlwZS9zdWJ0eXBlJnF1b3Q7KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb2R5KEJvZHkgYm9keSwgU3RyaW5nIG1pbWVUeXBlKSB7CisgICAgICAgIHNldEJvZHkoYm9keSwgbWltZVR5cGUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJvZHkgb2YgdGhpcyBlbnRpdHkgYW5kIHNldHMgdGhlIGNvbnRlbnQtdHlwZSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogdmFsdWUuIEEgPGNvZGU+SGVhZGVyPC9jb2RlPiBpcyBjcmVhdGVkIGlmIHRoaXMgZW50aXR5IGRvZXMgbm90IGFscmVhZHkKKyAgICAgKiBoYXZlIG9uZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYm9keQorICAgICAqICAgICAgICAgICAgdGhlIGJvZHkuCisgICAgICogQHBhcmFtIG1pbWVUeXBlCisgICAgICogICAgICAgICAgICB0aGUgTUlNRSBtZWRpYSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYm9keQorICAgICAqICAgICAgICAgICAgKCZxdW90O3R5cGUvc3VidHlwZSZxdW90OykuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm9keShCb2R5IGJvZHksIFN0cmluZyBtaW1lVHlwZSwKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgeworICAgICAgICBzZXRCb2R5KGJvZHkpOworCisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBvYnRhaW5IZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEZpZWxkcy5jb250ZW50VHlwZShtaW1lVHlwZSwgcGFyYW1ldGVycykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgdGhlIE1JTUUgdHlwZSBvZiB0aGlzIDxjb2RlPkVudGl0eTwvY29kZT4uIFRoZSBNSU1FIHR5cGUKKyAgICAgKiBpcyBkZXJpdmVkIGJ5IGxvb2tpbmcgYXQgdGhlIHBhcmVudCdzIENvbnRlbnQtVHlwZSBmaWVsZCBpZiBubworICAgICAqIENvbnRlbnQtVHlwZSBmaWVsZCBpcyBzZXQgZm9yIHRoaXMgPGNvZGU+RW50aXR5PC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBNSU1FIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKyAgICAgICAgQ29udGVudFR5cGVGaWVsZCBjaGlsZCA9IAorICAgICAgICAgICAgKENvbnRlbnRUeXBlRmllbGQpIGdldEhlYWRlcigpLmdldEZpZWxkKEZpZWxkTmFtZS5DT05URU5UX1RZUEUpOworICAgICAgICBDb250ZW50VHlwZUZpZWxkIHBhcmVudCA9IGdldFBhcmVudCgpICE9IG51bGwgCisgICAgICAgICAgICA/IChDb250ZW50VHlwZUZpZWxkKSBnZXRQYXJlbnQoKS5nZXRIZWFkZXIoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpZWxkKEZpZWxkTmFtZS5DT05URU5UX1RZUEUpCisgICAgICAgICAgICA6IG51bGw7CisgICAgICAgIAorICAgICAgICByZXR1cm4gQ29udGVudFR5cGVGaWVsZC5nZXRNaW1lVHlwZShjaGlsZCwgcGFyZW50KTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB0aGUgTUlNRSBjaGFyYWN0ZXIgc2V0IGVuY29kaW5nIG9mIHRoaXMgPGNvZGU+RW50aXR5PC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBNSU1FIGNoYXJhY3RlciBzZXQgZW5jb2RpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgeworICAgICAgICByZXR1cm4gQ29udGVudFR5cGVGaWVsZC5nZXRDaGFyc2V0KCAKKyAgICAgICAgICAgIChDb250ZW50VHlwZUZpZWxkKSBnZXRIZWFkZXIoKS5nZXRGaWVsZChGaWVsZE5hbWUuQ09OVEVOVF9UWVBFKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIERldGVybWluZXMgdGhlIHRyYW5zZmVyIGVuY29kaW5nIG9mIHRoaXMgPGNvZGU+RW50aXR5PC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2ZlciBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUcmFuc2ZlckVuY29kaW5nKCkgeworICAgICAgICBDb250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkIGYgPSAoQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZCkgCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRIZWFkZXIoKS5nZXRGaWVsZChGaWVsZE5hbWUuQ09OVEVOVF9UUkFOU0ZFUl9FTkNPRElORyk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZC5nZXRFbmNvZGluZyhmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB0cmFuc2ZlciBlbmNvZGluZyBvZiB0aGlzIDxjb2RlPkVudGl0eTwvY29kZT4gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIHZhbHVlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb250ZW50VHJhbnNmZXJFbmNvZGluZworICAgICAqICAgICAgICAgICAgdHJhbnNmZXIgZW5jb2RpbmcgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRUcmFuc2ZlckVuY29kaW5nKFN0cmluZyBjb250ZW50VHJhbnNmZXJFbmNvZGluZykgeworICAgICAgICBIZWFkZXIgaGVhZGVyID0gb2J0YWluSGVhZGVyKCk7CisgICAgICAgIGhlYWRlci5zZXRGaWVsZChGaWVsZHMuY29udGVudFRyYW5zZmVyRW5jb2RpbmcoY29udGVudFRyYW5zZmVyRW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGRpc3Bvc2l0aW9uIHR5cGUgb2YgdGhlIGNvbnRlbnQgZGlzcG9zaXRpb24gb2YgdGhpcworICAgICAqIDxjb2RlPkVudGl0eTwvY29kZT4uCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZGlzcG9zaXRpb24gdHlwZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBkaXNwb3NpdGlvbgorICAgICAqICAgICAgICAgdHlwZSBoYXMgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREaXNwb3NpdGlvblR5cGUoKSB7CisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGZpZWxkID0gb2J0YWluRmllbGQoRmllbGROYW1lLkNPTlRFTlRfRElTUE9TSVRJT04pOworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBmaWVsZC5nZXREaXNwb3NpdGlvblR5cGUoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBvZiB0aGlzIDxjb2RlPkVudGl0eTwvY29kZT4gdG8gdGhlCisgICAgICogc3BlY2lmaWVkIGRpc3Bvc2l0aW9uIHR5cGUuIE5vIGZpbGVuYW1lLCBzaXplIG9yIGRhdGUgcGFyYW1ldGVycworICAgICAqIGFyZSBpbmNsdWRlZCBpbiB0aGUgY29udGVudCBkaXNwb3NpdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGlzcG9zaXRpb25UeXBlCisgICAgICogICAgICAgICAgICBkaXNwb3NpdGlvbiB0eXBlIHZhbHVlICh1c3VhbGx5IDxjb2RlPmlubGluZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGlzcG9zaXRpb24oU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZSkgeworICAgICAgICBIZWFkZXIgaGVhZGVyID0gb2J0YWluSGVhZGVyKCk7CisgICAgICAgIGhlYWRlci5zZXRGaWVsZChGaWVsZHMuY29udGVudERpc3Bvc2l0aW9uKGRpc3Bvc2l0aW9uVHlwZSwgbnVsbCwgLTEsCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbnRlbnQgZGlzcG9zaXRpb24gb2YgdGhpcyA8Y29kZT5FbnRpdHk8L2NvZGU+IHRvIHRoZQorICAgICAqIHNwZWNpZmllZCBkaXNwb3NpdGlvbiB0eXBlIGFuZCBmaWxlbmFtZS4gTm8gc2l6ZSBvciBkYXRlIHBhcmFtZXRlcnMgYXJlCisgICAgICogaW5jbHVkZWQgaW4gdGhlIGNvbnRlbnQgZGlzcG9zaXRpb24uCisgICAgICogCisgICAgICogQHBhcmFtIGRpc3Bvc2l0aW9uVHlwZQorICAgICAqICAgICAgICAgICAgZGlzcG9zaXRpb24gdHlwZSB2YWx1ZSAodXN1YWxseSA8Y29kZT5pbmxpbmU8L2NvZGU+IG9yCisgICAgICogICAgICAgICAgICA8Y29kZT5hdHRhY2htZW50PC9jb2RlPikuCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogICAgICAgICAgICBmaWxlbmFtZSBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGlzcG9zaXRpb24oU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZSwgU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBvYnRhaW5IZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEZpZWxkcy5jb250ZW50RGlzcG9zaXRpb24oZGlzcG9zaXRpb25UeXBlLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAtMSwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbnRlbnQgZGlzcG9zaXRpb24gb2YgdGhpcyA8Y29kZT5FbnRpdHk8L2NvZGU+IHRvIHRoZQorICAgICAqIHNwZWNpZmllZCB2YWx1ZXMuIE5vIGRhdGUgcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvbnRlbnQKKyAgICAgKiBkaXNwb3NpdGlvbi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGlzcG9zaXRpb25UeXBlCisgICAgICogICAgICAgICAgICBkaXNwb3NpdGlvbiB0eXBlIHZhbHVlICh1c3VhbGx5IDxjb2RlPmlubGluZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+KS4KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgIGZpbGVuYW1lIHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIGluY2x1ZGVkLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICBzaXplIHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT4tMTwvY29kZT4gaWYgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGlzcG9zaXRpb24oU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZSwgU3RyaW5nIGZpbGVuYW1lLAorICAgICAgICAgICAgbG9uZyBzaXplKSB7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBvYnRhaW5IZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEZpZWxkcy5jb250ZW50RGlzcG9zaXRpb24oZGlzcG9zaXRpb25UeXBlLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICBzaXplLCBudWxsLCBudWxsLCBudWxsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBvZiB0aGlzIDxjb2RlPkVudGl0eTwvY29kZT4gdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZGlzcG9zaXRpb25UeXBlCisgICAgICogICAgICAgICAgICBkaXNwb3NpdGlvbiB0eXBlIHZhbHVlICh1c3VhbGx5IDxjb2RlPmlubGluZTwvY29kZT4gb3IKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPmF0dGFjaG1lbnQ8L2NvZGU+KS4KKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgIGZpbGVuYW1lIHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIGluY2x1ZGVkLgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICBzaXplIHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT4tMTwvY29kZT4gaWYgdGhlIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcGFyYW0gY3JlYXRpb25EYXRlCisgICAgICogICAgICAgICAgICBjcmVhdGlvbi1kYXRlIHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBzaG91bGQgbm90IGJlIGluY2x1ZGVkLgorICAgICAqIEBwYXJhbSBtb2RpZmljYXRpb25EYXRlCisgICAgICogICAgICAgICAgICBtb2RpZmljYXRpb24tZGF0ZSBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKiBAcGFyYW0gcmVhZERhdGUKKyAgICAgKiAgICAgICAgICAgIHJlYWQtZGF0ZSBwYXJhbWV0ZXIgdmFsdWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGlzcG9zaXRpb24oU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZSwgU3RyaW5nIGZpbGVuYW1lLAorICAgICAgICAgICAgbG9uZyBzaXplLCBEYXRlIGNyZWF0aW9uRGF0ZSwgRGF0ZSBtb2RpZmljYXRpb25EYXRlLCBEYXRlIHJlYWREYXRlKSB7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBvYnRhaW5IZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEZpZWxkcy5jb250ZW50RGlzcG9zaXRpb24oZGlzcG9zaXRpb25UeXBlLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICBzaXplLCBjcmVhdGlvbkRhdGUsIG1vZGlmaWNhdGlvbkRhdGUsIHJlYWREYXRlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZmlsZW5hbWUgcGFyYW1ldGVyIG9mIHRoZSBjb250ZW50IGRpc3Bvc2l0aW9uIG9mIHRoaXMKKyAgICAgKiA8Y29kZT5FbnRpdHk8L2NvZGU+LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBvZiB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBvcgorICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGVuYW1lIGhhcyBub3QgYmVlbiBzZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpIHsKKyAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgZmllbGQgPSBvYnRhaW5GaWVsZChGaWVsZE5hbWUuQ09OVEVOVF9ESVNQT1NJVElPTik7CisgICAgICAgIGlmIChmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldEZpbGVuYW1lKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpbGVuYW1lIHBhcmFtZXRlciBvZiB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBvZiB0aGlzCisgICAgICogPGNvZGU+RW50aXR5PC9jb2RlPiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGlzIGVudGl0eSBkb2VzIG5vdAorICAgICAqIGhhdmUgYSBjb250ZW50IGRpc3Bvc2l0aW9uIGhlYWRlciBmaWVsZCBhIG5ldyBvbmUgd2l0aCBkaXNwb3NpdGlvbiB0eXBlCisgICAgICogPGNvZGU+YXR0YWNobWVudDwvY29kZT4gaXMgY3JlYXRlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiAgICAgICAgICAgIGZpbGVuYW1lIHBhcmFtZXRlciB2YWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG9idGFpbkhlYWRlcigpOworICAgICAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZCBmaWVsZCA9IChDb250ZW50RGlzcG9zaXRpb25GaWVsZCkgaGVhZGVyCisgICAgICAgICAgICAgICAgLmdldEZpZWxkKEZpZWxkTmFtZS5DT05URU5UX0RJU1BPU0lUSU9OKTsKKyAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChmaWxlbmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyLnNldEZpZWxkKEZpZWxkcy5jb250ZW50RGlzcG9zaXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZC5ESVNQT1NJVElPTl9UWVBFX0FUVEFDSE1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgLTEsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBkaXNwb3NpdGlvblR5cGUgPSBmaWVsZC5nZXREaXNwb3NpdGlvblR5cGUoKTsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPihmaWVsZAorICAgICAgICAgICAgICAgICAgICAuZ2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5yZW1vdmUoQ29udGVudERpc3Bvc2l0aW9uRmllbGQuUEFSQU1fRklMRU5BTUUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAucHV0KENvbnRlbnREaXNwb3NpdGlvbkZpZWxkLlBBUkFNX0ZJTEVOQU1FLCBmaWxlbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZWFkZXIuc2V0RmllbGQoRmllbGRzLmNvbnRlbnREaXNwb3NpdGlvbihkaXNwb3NpdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgdGhlIE1JTUUgdHlwZSBvZiB0aGlzIDxjb2RlPkVudGl0eTwvY29kZT4gbWF0Y2hlcyB0aGUKKyAgICAgKiBnaXZlbiBvbmUuIE1JTUUgdHlwZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUgdGhlIE1JTUUgdHlwZSB0byBtYXRjaCBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gb24gbWF0Y2gsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNaW1lVHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICByZXR1cm4gZ2V0TWltZVR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBNSU1FIHR5cGUgb2YgdGhpcyA8Y29kZT5FbnRpdHk8L2NvZGU+IGlzCisgICAgICogPGNvZGU+bXVsdGlwYXJ0Lyo8L2NvZGU+LiBTaW5jZSBtdWx0aXBhcnQtZW50aXRpZXMgbXVzdCBoYXZlCisgICAgICogYSBib3VuZGFyeSBwYXJhbWV0ZXIgaW4gdGhlIDxjb2RlPkNvbnRlbnQtVHlwZTwvY29kZT4gZmllbGQgdGhpcworICAgICAqIG1ldGhvZCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBubyBib3VuZGFyeSBleGlzdHMuCisgICAgICogCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBvbiBtYXRjaCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc011bHRpcGFydCgpIHsKKyAgICAgICAgQ29udGVudFR5cGVGaWVsZCBmID0gCisgICAgICAgICAgICAoQ29udGVudFR5cGVGaWVsZCkgZ2V0SGVhZGVyKCkuZ2V0RmllbGQoRmllbGROYW1lLkNPTlRFTlRfVFlQRSk7CisgICAgICAgIHJldHVybiBmICE9IG51bGwgJiYgZi5nZXRCb3VuZGFyeSgpICE9IG51bGwgCisgICAgICAgICAgICAmJiBnZXRNaW1lVHlwZSgpLnN0YXJ0c1dpdGgoQ29udGVudFR5cGVGaWVsZC5UWVBFX01VTFRJUEFSVF9QUkVGSVgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3Bvc2VzIG9mIHRoZSBib2R5IG9mIHRoaXMgZW50aXR5LiBOb3RlIHRoYXQgdGhlIGRpc3Bvc2UgY2FsbCBkb2VzIG5vdAorICAgICAqIGdldCBmb3J3YXJkZWQgdG8gdGhlIHBhcmVudCBlbnRpdHkgb2YgdGhpcyBFbnRpdHkuCisgICAgICogCisgICAgICogU3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gZnJlZSByZXNvdXJjZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZAorICAgICAqIGludm9rZSBzdXBlci5kaXNwb3NlKCkuCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLkRpc3Bvc2FibGUjZGlzcG9zZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICAgICAgaWYgKGJvZHkgIT0gbnVsbCkgeworICAgICAgICAgICAgYm9keS5kaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIHRoZSBoZWFkZXIgb2YgdGhpcyBlbnRpdHkuIENyZWF0ZXMgYW5kIHNldHMgYSBuZXcgaGVhZGVyIGlmIHRoaXMKKyAgICAgKiBlbnRpdHkncyBoZWFkZXIgaXMgY3VycmVudGx5IDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGhlYWRlciBvZiB0aGlzIGVudGl0eTsgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICovCisgICAgSGVhZGVyIG9idGFpbkhlYWRlcigpIHsKKyAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhlYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIHRoZSBoZWFkZXIgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICogCisgICAgICogQHBhcmFtIDxGPgorICAgICAqICAgICAgICAgICAgY29uY3JldGUgZmllbGQgdHlwZS4KKyAgICAgKiBAcGFyYW0gZmllbGROYW1lCisgICAgICogICAgICAgICAgICBuYW1lIG9mIHRoZSBmaWVsZCB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBoZWFkZXIgZmllbGQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBlbnRpdHkgaGFzIG5vCisgICAgICogICAgICAgICBoZWFkZXIgb3IgdGhlIGhlYWRlciBjb250YWlucyBubyBzdWNoIGZpZWxkLgorICAgICAqLworICAgIDxGIGV4dGVuZHMgRmllbGQ+IEYgb2J0YWluRmllbGQoU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICBIZWFkZXIgaGVhZGVyID0gZ2V0SGVhZGVyKCk7CisgICAgICAgIGlmIChoZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBGIGZpZWxkID0gKEYpIGhlYWRlci5nZXRGaWVsZChmaWVsZE5hbWUpOworICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvSGVhZGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvSGVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhMjNlZQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9IZWFkZXIuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUlPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5BYnN0cmFjdENvbnRlbnRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZVN0cmVhbVBhcnNlcjsKKworLyoqCisgKiBUaGUgaGVhZGVyIG9mIGFuIGVudGl0eSAoc2VlIFJGQyAyMDQ1KS4KKyAqLworcHVibGljIGNsYXNzIEhlYWRlciBpbXBsZW1lbnRzIEl0ZXJhYmxlPEZpZWxkPiB7CisKKyAgICBwcml2YXRlIExpc3Q8RmllbGQ+IGZpZWxkcyA9IG5ldyBMaW5rZWRMaXN0PEZpZWxkPigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxGaWVsZD4+IGZpZWxkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PEZpZWxkPj4oKTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IDxjb2RlPkhlYWRlcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIEhlYWRlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkhlYWRlcjwvY29kZT4gZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+SGVhZGVyPC9jb2RlPi4gVGhlIDxjb2RlPkhlYWRlcjwvY29kZT4gaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQKKyAgICAgKiB3aXRoIGEgY29weSBvZiB0aGUgbGlzdCBvZiB7QGxpbmsgRmllbGR9cyBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+SGVhZGVyPC9jb2RlPi4gVGhlIDxjb2RlPkZpZWxkPC9jb2RlPiBvYmplY3RzIGFyZSBub3QgY29waWVkCisgICAgICogYmVjYXVzZSB0aGV5IGFyZSBpbW11dGFibGUgYW5kIGNhbiBzYWZlbHkgYmUgc2hhcmVkIGJldHdlZW4gaGVhZGVycy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3RoZXIKKyAgICAgKiAgICAgICAgICAgIGhlYWRlciB0byBjb3B5LgorICAgICAqLworICAgIHB1YmxpYyBIZWFkZXIoSGVhZGVyIG90aGVyKSB7CisgICAgICAgIGZvciAoRmllbGQgb3RoZXJGaWVsZCA6IG90aGVyLmZpZWxkcykgeworICAgICAgICAgICAgYWRkRmllbGQob3RoZXJGaWVsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkhlYWRlcjwvY29kZT4gZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXMgdGhlIHN0cmVhbSB0byByZWFkIHRoZSBoZWFkZXIgZnJvbS4KKyAgICAgKiAKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIEkvTyBlcnJvcnMuCisgICAgICogQHRocm93cyBNaW1lSU9FeGNlcHRpb24gb24gTUlNRSBwcm90b2NvbCB2aW9sYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBIZWFkZXIoSW5wdXRTdHJlYW0gaXMpIAorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNaW1lSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBNaW1lU3RyZWFtUGFyc2VyIHBhcnNlciA9IG5ldyBNaW1lU3RyZWFtUGFyc2VyKCk7CisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihuZXcgQWJzdHJhY3RDb250ZW50SGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kSGVhZGVyKCkgeworICAgICAgICAgICAgICAgIHBhcnNlci5zdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpZWxkKEZpZWxkIGZpZWxkKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgYWRkRmllbGQoZmllbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZShpcyk7CisgICAgICAgIH0gY2F0Y2ggKE1pbWVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaW1lSU9FeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGZpZWxkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgZmllbGRzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBmaWVsZCB0aGUgZmllbGQgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEZpZWxkKEZpZWxkIGZpZWxkKSB7CisgICAgICAgIExpc3Q8RmllbGQ+IHZhbHVlcyA9IGZpZWxkTWFwLmdldChmaWVsZC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWVzID0gbmV3IExpbmtlZExpc3Q8RmllbGQ+KCk7CisgICAgICAgICAgICBmaWVsZE1hcC5wdXQoZmllbGQuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCksIHZhbHVlcyk7CisgICAgICAgIH0KKyAgICAgICAgdmFsdWVzLmFkZChmaWVsZCk7CisgICAgICAgIGZpZWxkcy5hZGQoZmllbGQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaWVsZHMgb2YgdGhpcyBoZWFkZXIuIFRoZSByZXR1cm5lZCBsaXN0IHdpbGwgbm90IGJlCisgICAgICogbW9kaWZpYWJsZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIDxjb2RlPkZpZWxkPC9jb2RlPiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEZpZWxkPiBnZXRGaWVsZHMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGZpZWxkcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIDxjb2RlPkZpZWxkPC9jb2RlPiBnaXZlbiBhIGZpZWxkIG5hbWUuIElmIHRoZXJlIGFyZSBtdWx0aXBsZQorICAgICAqIHN1Y2ggZmllbGRzIGRlZmluZWQgaW4gdGhpcyBoZWFkZXIgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHJldHVybmVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBmaWVsZCBuYW1lIChlLmcuIEZyb20sIFN1YmplY3QpLgorICAgICAqIEByZXR1cm4gdGhlIGZpZWxkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgZm91bmQuCisgICAgICovCisgICAgcHVibGljIEZpZWxkIGdldEZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIExpc3Q8RmllbGQ+IGwgPSBmaWVsZE1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgaWYgKGwgIT0gbnVsbCAmJiAhbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBsLmdldCgwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgPGNvZGU+RmllbGQ8L2NvZGU+cyBoYXZpbmcgdGhlIHNwZWNpZmllZCBmaWVsZCBuYW1lLiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgZmllbGQgbmFtZSAoZS5nLiBGcm9tLCBTdWJqZWN0KS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxGaWVsZD4gZ2V0RmllbGRzKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb3dlckNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOworICAgICAgICBmaW5hbCBMaXN0PEZpZWxkPiBsID0gZmllbGRNYXAuZ2V0KGxvd2VyQ2FzZU5hbWUpOworICAgICAgICBmaW5hbCBMaXN0PEZpZWxkPiByZXN1bHRzOworICAgICAgICBpZiAobCA9PSBudWxsIHx8IGwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXN1bHRzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHRzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGxpc3Qgb2YgZmllbGRzIG9mIHRoaXMgaGVhZGVyLgorICAgICAqIAorICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yPEZpZWxkPiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZmllbGRzKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIDxjb2RlPkZpZWxkPC9jb2RlPnMgaGF2aW5nIHRoZSBzcGVjaWZpZWQgZmllbGQgbmFtZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkIG5hbWUgKGUuZy4gRnJvbSwgU3ViamVjdCkuCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZmllbGRzIHJlbW92ZWQuCisgICAgICovCisgICAgcHVibGljIGludCByZW1vdmVGaWVsZHMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyQ2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIExpc3Q8RmllbGQ+IHJlbW92ZWQgPSBmaWVsZE1hcC5yZW1vdmUobG93ZXJDYXNlTmFtZSk7CisgICAgICAgIGlmIChyZW1vdmVkID09IG51bGwgfHwgcmVtb3ZlZC5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yPEZpZWxkPiBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChmaWVsZC5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZW1vdmVkLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIG9yIHJlcGxhY2VzIGEgZmllbGQuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgaGVhZGVyIGZpZWxkcyBzdWNoIGFzCisgICAgICogU3ViamVjdCBvciBNZXNzYWdlLUlEIHRoYXQgc2hvdWxkIG5vdCBvY2N1ciBtb3JlIHRoYW4gb25jZSBpbiBhIG1lc3NhZ2UuCisgICAgICogCisgICAgICogSWYgdGhpcyA8Y29kZT5IZWFkZXI8L2NvZGU+IGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhIGhlYWRlciBmaWVsZCBvZgorICAgICAqIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdpdmVuIGZpZWxkIHRoZW4gaXQgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAorICAgICAqIG9mIGZpZWxkcyAoc2FtZSBiZWhhdmlvciBhcyB7QGxpbmsgI2FkZEZpZWxkKEZpZWxkKX0pLiBPdGhlcndpc2UgdGhlCisgICAgICogZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIGZpZWxkIHdpdGggdGhlIHNhbWUgbmFtZSBpcyByZXBsYWNlZCBieSB0aGUgZ2l2ZW4KKyAgICAgKiBmaWVsZCBhbmQgYWxsIGZ1cnRoZXIgb2NjdXJyZW5jZXMgYXJlIHJlbW92ZWQuCisgICAgICogCisgICAgICogQHBhcmFtIGZpZWxkIHRoZSBmaWVsZCB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmllbGQoRmllbGQgZmllbGQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyQ2FzZU5hbWUgPSBmaWVsZC5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgTGlzdDxGaWVsZD4gbCA9IGZpZWxkTWFwLmdldChsb3dlckNhc2VOYW1lKTsKKyAgICAgICAgaWYgKGwgPT0gbnVsbCB8fCBsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYWRkRmllbGQoZmllbGQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbC5jbGVhcigpOworICAgICAgICBsLmFkZChmaWVsZCk7CisKKyAgICAgICAgaW50IGZpcnN0T2NjdXJyZW5jZSA9IC0xOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKEl0ZXJhdG9yPEZpZWxkPiBpdGVyYXRvciA9IGZpZWxkcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7IGluZGV4KyspIHsKKyAgICAgICAgICAgIEZpZWxkIGYgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShmaWVsZC5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RPY2N1cnJlbmNlID09IC0xKQorICAgICAgICAgICAgICAgICAgICBmaXJzdE9jY3VycmVuY2UgPSBpbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpZWxkcy5hZGQoZmlyc3RPY2N1cnJlbmNlLCBmaWVsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIEhlYWRlciBPYmplY3QgYXMgU3RyaW5nIHJlcHJlc2VudGF0aW9uLiBFYWNoIGhlYWRlcmxpbmUgaXMKKyAgICAgKiBzZXBlcmF0ZWQgYnkgIlxyXG4iCisgICAgICogCisgICAgICogQHJldHVybiBoZWFkZXJzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigxMjgpOworICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisgICAgICAgICAgICBzdHIuYXBwZW5kKGZpZWxkLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgc3RyLmFwcGVuZCgiXHJcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHIudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9NZXNzYWdlLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDNmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNjA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lSU9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQWRkcmVzc0xpc3RGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5EYXRlVGltZUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkZpZWxkTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5GaWVsZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuTWFpbGJveEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLk1haWxib3hMaXN0RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuVW5zdHJ1Y3R1cmVkRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5BZGRyZXNzOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MuQWRkcmVzc0xpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5NYWlsYm94OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MuTWFpbGJveExpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5NaW1lRW50aXR5Q29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5NaW1lU3RyZWFtUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuRGVmYXVsdFN0b3JhZ2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlLlN0b3JhZ2VQcm92aWRlcjsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgTUlNRSBtZXNzYWdlLiBUaGUgZm9sbG93aW5nIGNvZGUgcGFyc2VzIGEgc3RyZWFtIGludG8gYQorICogPGNvZGU+TWVzc2FnZTwvY29kZT4gb2JqZWN0LgorICogCisgKiA8cHJlPgorICogTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZShuZXcgRmlsZUlucHV0U3RyZWFtKCZxdW90O21pbWUubXNnJnF1b3Q7KSk7CisgKiA8L3ByZT4KKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2UgZXh0ZW5kcyBFbnRpdHkgaW1wbGVtZW50cyBCb2R5IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgZW1wdHkgPGNvZGU+TWVzc2FnZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NZXNzYWdlPC9jb2RlPiBmcm9tIHRoZSBzcGVjaWZpZWQKKyAgICAgKiA8Y29kZT5NZXNzYWdlPC9jb2RlPi4gVGhlIDxjb2RlPk1lc3NhZ2U8L2NvZGU+IGluc3RhbmNlIGlzCisgICAgICogaW5pdGlhbGl6ZWQgd2l0aCBjb3BpZXMgb2YgaGVhZGVyIGFuZCBib2R5IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiA8Y29kZT5NZXNzYWdlPC9jb2RlPi4gVGhlIHBhcmVudCBlbnRpdHkgb2YgdGhlIG5ldyBtZXNzYWdlIGlzCisgICAgICogPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIG90aGVyCisgICAgICogICAgICAgICAgICBtZXNzYWdlIHRvIGNvcHkuCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIDxjb2RlPm90aGVyPC9jb2RlPiBjb250YWlucyBhIHtAbGluayBTaW5nbGVCb2R5fSB0aGF0CisgICAgICogICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCB0aGUge0BsaW5rIFNpbmdsZUJvZHkjY29weSgpIGNvcHkoKX0KKyAgICAgKiAgICAgICAgICAgICBvcGVyYXRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vdGhlcjwvY29kZT4gY29udGFpbnMgYSA8Y29kZT5Cb2R5PC9jb2RlPiB0aGF0CisgICAgICogICAgICAgICAgICAgaXMgbmVpdGhlciBhIHtAbGluayBNZXNzYWdlfSwge0BsaW5rIE11bHRpcGFydH0gb3IKKyAgICAgKiAgICAgICAgICAgICB7QGxpbmsgU2luZ2xlQm9keX0uCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UoTWVzc2FnZSBvdGhlcikgeworICAgICAgICBzdXBlcihvdGhlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgTUlNRSBtZXNzYWdlIHN0cmVhbSBpbnRvIGEgPGNvZGU+TWVzc2FnZTwvY29kZT4KKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gcGFyc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIG9uIEkvTyBlcnJvcnMuCisgICAgICogQHRocm93cyBNaW1lSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBvbiBNSU1FIHByb3RvY29sIHZpb2xhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWltZUlPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhpcywgbnVsbCwgRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBNSU1FIG1lc3NhZ2Ugc3RyZWFtIGludG8gYSA8Y29kZT5NZXNzYWdlPC9jb2RlPgorICAgICAqIGluc3RhbmNlIHVzaW5nIGdpdmVuIHtAbGluayBNaW1lRW50aXR5Q29uZmlnfS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gaXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gcGFyc2UuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIG9uIEkvTyBlcnJvcnMuCisgICAgICogQHRocm93cyBNaW1lSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBvbiBNSU1FIHByb3RvY29sIHZpb2xhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2UoSW5wdXRTdHJlYW0gaXMsIE1pbWVFbnRpdHlDb25maWcgY29uZmlnKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBNaW1lSU9FeGNlcHRpb24geworICAgICAgICB0aGlzKGlzLCBjb25maWcsIERlZmF1bHRTdG9yYWdlUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgTUlNRSBtZXNzYWdlIHN0cmVhbSBpbnRvIGEgPGNvZGU+TWVzc2FnZTwvY29kZT4KKyAgICAgKiBpbnN0YW5jZSB1c2luZyBnaXZlbiB7QGxpbmsgTWltZUVudGl0eUNvbmZpZ30gYW5kIHtAbGluayBTdG9yYWdlUHJvdmlkZXJ9LgorICAgICAqIAorICAgICAqIEBwYXJhbSBpcworICAgICAqICAgICAgICAgICAgdGhlIHN0cmVhbSB0byBwYXJzZS4KKyAgICAgKiBAcGFyYW0gY29uZmlnCisgICAgICogICAgICAgICAgICB7QGxpbmsgTWltZUVudGl0eUNvbmZpZ30gdG8gdXNlLgorICAgICAqIEBwYXJhbSBzdG9yYWdlUHJvdmlkZXIKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBTdG9yYWdlUHJvdmlkZXJ9IHRvIHVzZSBmb3Igc3RvcmluZyB0ZXh0IGFuZCBiaW5hcnkKKyAgICAgKiAgICAgICAgICAgIG1lc3NhZ2UgYm9kaWVzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBvbiBJL08gZXJyb3JzLgorICAgICAqIEB0aHJvd3MgTWltZUlPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgb24gTUlNRSBwcm90b2NvbCB2aW9sYXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlKElucHV0U3RyZWFtIGlzLCBNaW1lRW50aXR5Q29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgIFN0b3JhZ2VQcm92aWRlciBzdG9yYWdlUHJvdmlkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIE1pbWVJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNaW1lU3RyZWFtUGFyc2VyIHBhcnNlciA9IG5ldyBNaW1lU3RyZWFtUGFyc2VyKGNvbmZpZyk7CisgICAgICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IE1lc3NhZ2VCdWlsZGVyKHRoaXMsIHN0b3JhZ2VQcm92aWRlcikpOworICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGlzKTsKKyAgICAgICAgfSBjYXRjaCAoTWltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWltZUlPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGNvbnRlbnQgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0gdXNpbmcgdGhlCisgICAgICoge0BsaW5rIE1lc3NhZ2VXcml0ZXIjREVGQVVMVCBkZWZhdWx0fSBtZXNzYWdlIHdyaXRlci4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB0aGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaW4gY2FzZSBvZiBhbiBJL08gZXJyb3IKKyAgICAgKiBAc2VlIE1lc3NhZ2VXcml0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2VXcml0ZXIuREVGQVVMVC53cml0ZUVudGl0eSh0aGlzLCBvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSA8aT5NZXNzYWdlLUlEPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90IHByZXNlbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGlzIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoKSB7CisgICAgICAgIEZpZWxkIGZpZWxkID0gb2J0YWluRmllbGQoRmllbGROYW1lLk1FU1NBR0VfSUQpOworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBmaWVsZC5nZXRCb2R5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgc2V0cyBhIG5ldyA8aT5NZXNzYWdlLUlEPC9pPiBoZWFkZXIgZmllbGQgZm9yIHRoaXMgbWVzc2FnZS4KKyAgICAgKiBBIDxjb2RlPkhlYWRlcjwvY29kZT4gaXMgY3JlYXRlZCBpZiB0aGlzIG1lc3NhZ2UgZG9lcyBub3QgYWxyZWFkeSBoYXZlCisgICAgICogb25lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBob3N0bmFtZQorICAgICAqICAgICAgICAgICAgaG9zdCBuYW1lIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBpZGVudGlmaWVyIG9yCisgICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBob3N0IG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNyZWF0ZU1lc3NhZ2VJZChTdHJpbmcgaG9zdG5hbWUpIHsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG9idGFpbkhlYWRlcigpOworCisgICAgICAgIGhlYWRlci5zZXRGaWVsZChGaWVsZHMubWVzc2FnZUlkKGhvc3RuYW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgKGRlY29kZWQpIHZhbHVlIG9mIHRoZSA8aT5TdWJqZWN0PC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcworICAgICAqIG1lc3NhZ2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90IHByZXNlbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc3ViamVjdCBvZiB0aGlzIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdWJqZWN0KCkgeworICAgICAgICBVbnN0cnVjdHVyZWRGaWVsZCBmaWVsZCA9IG9idGFpbkZpZWxkKEZpZWxkTmFtZS5TVUJKRUNUKTsKKyAgICAgICAgaWYgKGZpZWxkID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gZmllbGQuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8aT5TdWJqZWN0PC9pPiBoZWFkZXIgZmllbGQgZm9yIHRoaXMgbWVzc2FnZS4gVGhlIHNwZWNpZmllZAorICAgICAqIHN0cmluZyBtYXkgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycywgaW4gd2hpY2ggY2FzZSBpdCBnZXRzIGVuY29kZWQgYXMKKyAgICAgKiBhbiAnZW5jb2RlZC13b3JkJyBhdXRvbWF0aWNhbGx5LiBBIDxjb2RlPkhlYWRlcjwvY29kZT4gaXMgY3JlYXRlZCBpZgorICAgICAqIHRoaXMgbWVzc2FnZSBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgb25lLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdWJqZWN0CisgICAgICogICAgICAgICAgICBzdWJqZWN0IHRvIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgdGhlIHN1YmplY3QKKyAgICAgKiAgICAgICAgICAgIGhlYWRlciBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJqZWN0KFN0cmluZyBzdWJqZWN0KSB7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBvYnRhaW5IZWFkZXIoKTsKKworICAgICAgICBpZiAoc3ViamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICBoZWFkZXIucmVtb3ZlRmllbGRzKEZpZWxkTmFtZS5TVUJKRUNUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhlYWRlci5zZXRGaWVsZChGaWVsZHMuc3ViamVjdChzdWJqZWN0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgPGk+RGF0ZTwvaT4gaGVhZGVyIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSBhcworICAgICAqIDxjb2RlPkRhdGU8L2NvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QgcHJlc2VudC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRlIG9mIHRoaXMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkgeworICAgICAgICBEYXRlVGltZUZpZWxkIGRhdGVGaWVsZCA9IG9idGFpbkZpZWxkKEZpZWxkTmFtZS5EQVRFKTsKKyAgICAgICAgaWYgKGRhdGVGaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIGRhdGVGaWVsZC5nZXREYXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGk+RGF0ZTwvaT4gaGVhZGVyIGZpZWxkIGZvciB0aGlzIG1lc3NhZ2UuIFRoaXMgbWV0aG9kIHVzZXMgdGhlCisgICAgICogZGVmYXVsdCA8Y29kZT5UaW1lWm9uZTwvY29kZT4gb2YgdGhpcyBob3N0IHRvIGVuY29kZSB0aGUgc3BlY2lmaWVkCisgICAgICogPGNvZGU+RGF0ZTwvY29kZT4gb2JqZWN0IGludG8gYSBzdHJpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGRhdGUKKyAgICAgKiAgICAgICAgICAgIGRhdGUgdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSB0aGUgZGF0ZSBoZWFkZXIKKyAgICAgKiAgICAgICAgICAgIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERhdGUoRGF0ZSBkYXRlKSB7CisgICAgICAgIHNldERhdGUoZGF0ZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGk+RGF0ZTwvaT4gaGVhZGVyIGZpZWxkIGZvciB0aGlzIG1lc3NhZ2UuIFRoZSBzcGVjaWZpZWQKKyAgICAgKiA8Y29kZT5UaW1lWm9uZTwvY29kZT4gaXMgdXNlZCB0byBlbmNvZGUgdGhlIHNwZWNpZmllZCA8Y29kZT5EYXRlPC9jb2RlPgorICAgICAqIG9iamVjdCBpbnRvIGEgc3RyaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBkYXRlCisgICAgICogICAgICAgICAgICBkYXRlIHRvIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgdGhlIGRhdGUgaGVhZGVyCisgICAgICogICAgICAgICAgICBmaWVsZC4KKyAgICAgKiBAcGFyYW0gem9uZQorICAgICAqICAgICAgICAgICAgYSB0aW1lIHpvbmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGF0ZShEYXRlIGRhdGUsIFRpbWVab25lIHpvbmUpIHsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG9idGFpbkhlYWRlcigpOworCisgICAgICAgIGlmIChkYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIGhlYWRlci5yZW1vdmVGaWVsZHMoRmllbGROYW1lLkRBVEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVhZGVyLnNldEZpZWxkKEZpZWxkcy5kYXRlKEZpZWxkTmFtZS5EQVRFLCBkYXRlLCB6b25lKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgPGk+U2VuZGVyPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIGFzCisgICAgICogPGNvZGU+TWFpbGJveDwvY29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGlzIG5vdAorICAgICAqIHByZXNlbnQuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgc2VuZGVyIG9mIHRoaXMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFpbGJveCBnZXRTZW5kZXIoKSB7CisgICAgICAgIHJldHVybiBnZXRNYWlsYm94KEZpZWxkTmFtZS5TRU5ERVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxpPlNlbmRlcjwvaT4gaGVhZGVyIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogbWFpbGJveCBhZGRyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgIGFkZHJlc3MgdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSB0aGUgaGVhZGVyCisgICAgICogICAgICAgICAgICBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZW5kZXIoTWFpbGJveCBzZW5kZXIpIHsKKyAgICAgICAgc2V0TWFpbGJveChGaWVsZE5hbWUuU0VOREVSLCBzZW5kZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSA8aT5Gcm9tPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIGFzCisgICAgICogPGNvZGU+TWFpbGJveExpc3Q8L2NvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QKKyAgICAgKiBwcmVzZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIGZyb20gZmllbGQgb2YgdGhpcyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBNYWlsYm94TGlzdCBnZXRGcm9tKCkgeworICAgICAgICByZXR1cm4gZ2V0TWFpbGJveExpc3QoRmllbGROYW1lLkZST00pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxpPkZyb208L2k+IGhlYWRlciBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIG1haWxib3ggYWRkcmVzcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJvbQorICAgICAqICAgICAgICAgICAgYWRkcmVzcyB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIHRoZSBoZWFkZXIKKyAgICAgKiAgICAgICAgICAgIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oTWFpbGJveCBmcm9tKSB7CisgICAgICAgIHNldE1haWxib3hMaXN0KEZpZWxkTmFtZS5GUk9NLCBmcm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8aT5Gcm9tPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtYWlsYm94IGFkZHJlc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJvbQorICAgICAqICAgICAgICAgICAgYWRkcmVzc2VzIHRvIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiBvciBubyBhcmd1bWVudHMgdG8KKyAgICAgKiAgICAgICAgICAgIHJlbW92ZSB0aGUgaGVhZGVyIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZyb20oTWFpbGJveC4uLiBmcm9tKSB7CisgICAgICAgIHNldE1haWxib3hMaXN0KEZpZWxkTmFtZS5GUk9NLCBmcm9tKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8aT5Gcm9tPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBtYWlsYm94IGFkZHJlc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJvbQorICAgICAqICAgICAgICAgICAgYWRkcmVzc2VzIHRvIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiBvciBhbiBlbXB0eSBjb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICB0byByZW1vdmUgdGhlIGhlYWRlciBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKENvbGxlY3Rpb248TWFpbGJveD4gZnJvbSkgeworICAgICAgICBzZXRNYWlsYm94TGlzdChGaWVsZE5hbWUuRlJPTSwgZnJvbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIDxpPlRvPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIGFzCisgICAgICogPGNvZGU+QWRkcmVzc0xpc3Q8L2NvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QKKyAgICAgKiBwcmVzZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIHRvIGZpZWxkIG9mIHRoaXMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWRkcmVzc0xpc3QgZ2V0VG8oKSB7CisgICAgICAgIHJldHVybiBnZXRBZGRyZXNzTGlzdChGaWVsZE5hbWUuVE8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxpPlRvPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhZGRyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0bworICAgICAqICAgICAgICAgICAgYWRkcmVzcyB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIHRoZSBoZWFkZXIKKyAgICAgKiAgICAgICAgICAgIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvKEFkZHJlc3MgdG8pIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoRmllbGROYW1lLlRPLCB0byk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGk+VG88L2k+IGhlYWRlciBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGFkZHJlc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gdG8KKyAgICAgKiAgICAgICAgICAgIGFkZHJlc3NlcyB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3Igbm8gYXJndW1lbnRzIHRvCisgICAgICogICAgICAgICAgICByZW1vdmUgdGhlIGhlYWRlciBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUbyhBZGRyZXNzLi4uIHRvKSB7CisgICAgICAgIHNldEFkZHJlc3NMaXN0KEZpZWxkTmFtZS5UTywgdG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxpPlRvPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhZGRyZXNzZXMuCisgICAgICogCisgICAgICogQHBhcmFtIHRvCisgICAgICogICAgICAgICAgICBhZGRyZXNzZXMgdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGVtcHR5IGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRvIHJlbW92ZSB0aGUgaGVhZGVyIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRvKENvbGxlY3Rpb248QWRkcmVzcz4gdG8pIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoRmllbGROYW1lLlRPLCB0byk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIDxpPkNjPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIGFzCisgICAgICogPGNvZGU+QWRkcmVzc0xpc3Q8L2NvZGU+IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QKKyAgICAgKiBwcmVzZW50LgorICAgICAqIAorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIGNjIGZpZWxkIG9mIHRoaXMgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWRkcmVzc0xpc3QgZ2V0Q2MoKSB7CisgICAgICAgIHJldHVybiBnZXRBZGRyZXNzTGlzdChGaWVsZE5hbWUuQ0MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxpPkNjPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhZGRyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBjYworICAgICAqICAgICAgICAgICAgYWRkcmVzcyB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIHRoZSBoZWFkZXIKKyAgICAgKiAgICAgICAgICAgIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENjKEFkZHJlc3MgY2MpIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoRmllbGROYW1lLkNDLCBjYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgPGk+Q2M8L2k+IGhlYWRlciBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGFkZHJlc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2MKKyAgICAgKiAgICAgICAgICAgIGFkZHJlc3NlcyB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3Igbm8gYXJndW1lbnRzIHRvCisgICAgICogICAgICAgICAgICByZW1vdmUgdGhlIGhlYWRlciBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYyhBZGRyZXNzLi4uIGNjKSB7CisgICAgICAgIHNldEFkZHJlc3NMaXN0KEZpZWxkTmFtZS5DQywgY2MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxpPkNjPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhZGRyZXNzZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGNjCisgICAgICogICAgICAgICAgICBhZGRyZXNzZXMgdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGVtcHR5IGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRvIHJlbW92ZSB0aGUgaGVhZGVyIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENjKENvbGxlY3Rpb248QWRkcmVzcz4gY2MpIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoRmllbGROYW1lLkNDLCBjYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIDxpPkJjYzwvaT4gaGVhZGVyIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSBhcworICAgICAqIDxjb2RlPkFkZHJlc3NMaXN0PC9jb2RlPiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90CisgICAgICogcHJlc2VudC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHRoZSBiY2MgZmllbGQgb2YgdGhpcyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBBZGRyZXNzTGlzdCBnZXRCY2MoKSB7CisgICAgICAgIHJldHVybiBnZXRBZGRyZXNzTGlzdChGaWVsZE5hbWUuQkNDKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8aT5CY2M8L2k+IGhlYWRlciBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGFkZHJlc3MuCisgICAgICogCisgICAgICogQHBhcmFtIGJjYworICAgICAqICAgICAgICAgICAgYWRkcmVzcyB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIHRoZSBoZWFkZXIKKyAgICAgKiAgICAgICAgICAgIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJjYyhBZGRyZXNzIGJjYykgeworICAgICAgICBzZXRBZGRyZXNzTGlzdChGaWVsZE5hbWUuQkNDLCBiY2MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxpPkJjYzwvaT4gaGVhZGVyIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogYWRkcmVzc2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSBiY2MKKyAgICAgKiAgICAgICAgICAgIGFkZHJlc3NlcyB0byBzZXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gb3Igbm8gYXJndW1lbnRzIHRvCisgICAgICogICAgICAgICAgICByZW1vdmUgdGhlIGhlYWRlciBmaWVsZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCY2MoQWRkcmVzcy4uLiBiY2MpIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoRmllbGROYW1lLkJDQywgYmNjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8aT5CY2M8L2k+IGhlYWRlciBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UgdG8gdGhlIHNwZWNpZmllZAorICAgICAqIGFkZHJlc3Nlcy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYmNjCisgICAgICogICAgICAgICAgICBhZGRyZXNzZXMgdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGVtcHR5IGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRvIHJlbW92ZSB0aGUgaGVhZGVyIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJjYyhDb2xsZWN0aW9uPEFkZHJlc3M+IGJjYykgeworICAgICAgICBzZXRBZGRyZXNzTGlzdChGaWVsZE5hbWUuQkNDLCBiY2MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSA8aT5SZXBseS1UbzwvaT4gaGVhZGVyIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSBhcworICAgICAqIDxjb2RlPkFkZHJlc3NMaXN0PC9jb2RlPiBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90CisgICAgICogcHJlc2VudC4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHRoZSByZXBseSB0byBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIEFkZHJlc3NMaXN0IGdldFJlcGx5VG8oKSB7CisgICAgICAgIHJldHVybiBnZXRBZGRyZXNzTGlzdChGaWVsZE5hbWUuUkVQTFlfVE8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxpPlJlcGx5LVRvPC9pPiBoZWFkZXIgZmllbGQgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBhZGRyZXNzLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXBseVRvCisgICAgICogICAgICAgICAgICBhZGRyZXNzIHRvIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgdGhlIGhlYWRlcgorICAgICAqICAgICAgICAgICAgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwbHlUbyhBZGRyZXNzIHJlcGx5VG8pIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoRmllbGROYW1lLlJFUExZX1RPLCByZXBseVRvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8aT5SZXBseS1UbzwvaT4gaGVhZGVyIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogYWRkcmVzc2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXBseVRvCisgICAgICogICAgICAgICAgICBhZGRyZXNzZXMgdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIG5vIGFyZ3VtZW50cyB0bworICAgICAqICAgICAgICAgICAgcmVtb3ZlIHRoZSBoZWFkZXIgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwbHlUbyhBZGRyZXNzLi4uIHJlcGx5VG8pIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoRmllbGROYW1lLlJFUExZX1RPLCByZXBseVRvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSA8aT5SZXBseS1UbzwvaT4gaGVhZGVyIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkCisgICAgICogYWRkcmVzc2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSByZXBseVRvCisgICAgICogICAgICAgICAgICBhZGRyZXNzZXMgdG8gc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IG9yIGFuIGVtcHR5IGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgICAgIHRvIHJlbW92ZSB0aGUgaGVhZGVyIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGx5VG8oQ29sbGVjdGlvbjxBZGRyZXNzPiByZXBseVRvKSB7CisgICAgICAgIHNldEFkZHJlc3NMaXN0KEZpZWxkTmFtZS5SRVBMWV9UTywgcmVwbHlUbyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNYWlsYm94IGdldE1haWxib3goU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICBNYWlsYm94RmllbGQgZmllbGQgPSBvYnRhaW5GaWVsZChmaWVsZE5hbWUpOworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBmaWVsZC5nZXRNYWlsYm94KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE1haWxib3goU3RyaW5nIGZpZWxkTmFtZSwgTWFpbGJveCBtYWlsYm94KSB7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBvYnRhaW5IZWFkZXIoKTsKKworICAgICAgICBpZiAobWFpbGJveCA9PSBudWxsKSB7CisgICAgICAgICAgICBoZWFkZXIucmVtb3ZlRmllbGRzKGZpZWxkTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoZWFkZXIuc2V0RmllbGQoRmllbGRzLm1haWxib3goZmllbGROYW1lLCBtYWlsYm94KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE1haWxib3hMaXN0IGdldE1haWxib3hMaXN0KFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgTWFpbGJveExpc3RGaWVsZCBmaWVsZCA9IG9idGFpbkZpZWxkKGZpZWxkTmFtZSk7CisgICAgICAgIGlmIChmaWVsZCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldE1haWxib3hMaXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE1haWxib3hMaXN0KFN0cmluZyBmaWVsZE5hbWUsIE1haWxib3ggbWFpbGJveCkgeworICAgICAgICBzZXRNYWlsYm94TGlzdChmaWVsZE5hbWUsIG1haWxib3ggPT0gbnVsbCA/IG51bGwgOiBDb2xsZWN0aW9ucworICAgICAgICAgICAgICAgIC5zaW5nbGV0b24obWFpbGJveCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRNYWlsYm94TGlzdChTdHJpbmcgZmllbGROYW1lLCBNYWlsYm94Li4uIG1haWxib3hlcykgeworICAgICAgICBzZXRNYWlsYm94TGlzdChmaWVsZE5hbWUsIG1haWxib3hlcyA9PSBudWxsID8gbnVsbCA6IEFycmF5cworICAgICAgICAgICAgICAgIC5hc0xpc3QobWFpbGJveGVzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldE1haWxib3hMaXN0KFN0cmluZyBmaWVsZE5hbWUsIENvbGxlY3Rpb248TWFpbGJveD4gbWFpbGJveGVzKSB7CisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBvYnRhaW5IZWFkZXIoKTsKKworICAgICAgICBpZiAobWFpbGJveGVzID09IG51bGwgfHwgbWFpbGJveGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaGVhZGVyLnJlbW92ZUZpZWxkcyhmaWVsZE5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVhZGVyLnNldEZpZWxkKEZpZWxkcy5tYWlsYm94TGlzdChmaWVsZE5hbWUsIG1haWxib3hlcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBBZGRyZXNzTGlzdCBnZXRBZGRyZXNzTGlzdChTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICAgIEFkZHJlc3NMaXN0RmllbGQgZmllbGQgPSBvYnRhaW5GaWVsZChmaWVsZE5hbWUpOworICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBmaWVsZC5nZXRBZGRyZXNzTGlzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBZGRyZXNzTGlzdChTdHJpbmcgZmllbGROYW1lLCBBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoZmllbGROYW1lLCBhZGRyZXNzID09IG51bGwgPyBudWxsIDogQ29sbGVjdGlvbnMKKyAgICAgICAgICAgICAgICAuc2luZ2xldG9uKGFkZHJlc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0QWRkcmVzc0xpc3QoU3RyaW5nIGZpZWxkTmFtZSwgQWRkcmVzcy4uLiBhZGRyZXNzZXMpIHsKKyAgICAgICAgc2V0QWRkcmVzc0xpc3QoZmllbGROYW1lLCBhZGRyZXNzZXMgPT0gbnVsbCA/IG51bGwgOiBBcnJheXMKKyAgICAgICAgICAgICAgICAuYXNMaXN0KGFkZHJlc3NlcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRBZGRyZXNzTGlzdChTdHJpbmcgZmllbGROYW1lLCBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlcykgeworICAgICAgICBIZWFkZXIgaGVhZGVyID0gb2J0YWluSGVhZGVyKCk7CisKKyAgICAgICAgaWYgKGFkZHJlc3NlcyA9PSBudWxsIHx8IGFkZHJlc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGhlYWRlci5yZW1vdmVGaWVsZHMoZmllbGROYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhlYWRlci5zZXRGaWVsZChGaWVsZHMuYWRkcmVzc0xpc3QoZmllbGROYW1lLCBhZGRyZXNzZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VCdWlsZGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDFmNTczCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLkJhc2U2NElucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLlF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3IuQm9keURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQWJzdHJhY3RGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5NaW1lU3RyZWFtUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuU3RvcmFnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZUFycmF5QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuTWltZVV0aWw7CisKKy8qKgorICogQSA8Y29kZT5Db250ZW50SGFuZGxlcjwvY29kZT4gZm9yIGJ1aWxkaW5nIGFuIDxjb2RlPkVudGl0eTwvY29kZT4gdG8gYmUKKyAqIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhIHtAbGluayBNaW1lU3RyZWFtUGFyc2VyfS4KKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VCdWlsZGVyIGltcGxlbWVudHMgQ29udGVudEhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBFbnRpdHkgZW50aXR5OworICAgIHByaXZhdGUgZmluYWwgQm9keUZhY3RvcnkgYm9keUZhY3Rvcnk7CisgICAgcHJpdmF0ZSBTdGFjazxPYmplY3Q+IHN0YWNrID0gbmV3IFN0YWNrPE9iamVjdD4oKTsKKyAgICAKKyAgICBwdWJsaWMgTWVzc2FnZUJ1aWxkZXIoRW50aXR5IGVudGl0eSkgeworICAgICAgICB0aGlzLmVudGl0eSA9IGVudGl0eTsKKyAgICAgICAgdGhpcy5ib2R5RmFjdG9yeSA9IG5ldyBCb2R5RmFjdG9yeSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgTWVzc2FnZUJ1aWxkZXIoRW50aXR5IGVudGl0eSwgU3RvcmFnZVByb3ZpZGVyIHN0b3JhZ2VQcm92aWRlcikgeworICAgICAgICB0aGlzLmVudGl0eSA9IGVudGl0eTsKKyAgICAgICAgdGhpcy5ib2R5RmFjdG9yeSA9IG5ldyBCb2R5RmFjdG9yeShzdG9yYWdlUHJvdmlkZXIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZXhwZWN0KENsYXNzPD8+IGMpIHsKKyAgICAgICAgaWYgKCFjLmlzSW5zdGFuY2Uoc3RhY2sucGVlaygpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJuYWwgc3RhY2sgZXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgKyAiRXhwZWN0ZWQgJyIgKyBjLmdldE5hbWUoKSArICInIGZvdW5kICciCisgICAgICAgICAgICAgICAgICAgICsgc3RhY2sucGVlaygpLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5Db250ZW50SGFuZGxlciNzdGFydE1lc3NhZ2UoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TWVzc2FnZSgpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RhY2sucHVzaCh0aGlzLmVudGl0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleHBlY3QoRW50aXR5LmNsYXNzKTsKKyAgICAgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgICAgICAoKEVudGl0eSkgc3RhY2sucGVlaygpKS5zZXRCb2R5KG0pOworICAgICAgICAgICAgc3RhY2sucHVzaChtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5Db250ZW50SGFuZGxlciNlbmRNZXNzYWdlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRNZXNzYWdlKCkgdGhyb3dzIE1pbWVFeGNlcHRpb24geworICAgICAgICBleHBlY3QoTWVzc2FnZS5jbGFzcyk7CisgICAgICAgIHN0YWNrLnBvcCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5Db250ZW50SGFuZGxlciNzdGFydEhlYWRlcigpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc3RhcnRIZWFkZXIoKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiB7CisgICAgICAgIHN0YWNrLnB1c2gobmV3IEhlYWRlcigpKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXIjZmllbGQoRmllbGQpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmllbGQoRmllbGQgZmllbGQpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEhlYWRlci5jbGFzcyk7CisgICAgICAgIEZpZWxkIHBhcnNlZEZpZWxkID0gQWJzdHJhY3RGaWVsZC5wYXJzZShmaWVsZC5nZXRSYXcoKSk7IAorICAgICAgICAoKEhlYWRlcikgc3RhY2sucGVlaygpKS5hZGRGaWVsZChwYXJzZWRGaWVsZCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI2VuZEhlYWRlcigpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5kSGVhZGVyKCkgdGhyb3dzIE1pbWVFeGNlcHRpb24geworICAgICAgICBleHBlY3QoSGVhZGVyLmNsYXNzKTsKKyAgICAgICAgSGVhZGVyIGggPSAoSGVhZGVyKSBzdGFjay5wb3AoKTsKKyAgICAgICAgZXhwZWN0KEVudGl0eS5jbGFzcyk7CisgICAgICAgICgoRW50aXR5KSBzdGFjay5wZWVrKCkpLnNldEhlYWRlcihoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXIjc3RhcnRNdWx0aXBhcnQob3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvci5Cb2R5RGVzY3JpcHRvcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydE11bHRpcGFydChmaW5hbCBCb2R5RGVzY3JpcHRvciBiZCkgdGhyb3dzIE1pbWVFeGNlcHRpb24geworICAgICAgICBleHBlY3QoRW50aXR5LmNsYXNzKTsKKyAgICAgICAgCisgICAgICAgIGZpbmFsIEVudGl0eSBlID0gKEVudGl0eSkgc3RhY2sucGVlaygpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3ViVHlwZSA9IGJkLmdldFN1YlR5cGUoKTsKKyAgICAgICAgZmluYWwgTXVsdGlwYXJ0IG11bHRpUGFydCA9IG5ldyBNdWx0aXBhcnQoc3ViVHlwZSk7CisgICAgICAgIGUuc2V0Qm9keShtdWx0aVBhcnQpOworICAgICAgICBzdGFjay5wdXNoKG11bHRpUGFydCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI2JvZHkob3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvci5Cb2R5RGVzY3JpcHRvciwgamF2YS5pby5JbnB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBib2R5KEJvZHlEZXNjcmlwdG9yIGJkLCBmaW5hbCBJbnB1dFN0cmVhbSBpcykgdGhyb3dzIE1pbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEVudGl0eS5jbGFzcyk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBTdHJpbmcgZW5jID0gYmQuZ2V0VHJhbnNmZXJFbmNvZGluZygpOworICAgICAgICAKKyAgICAgICAgZmluYWwgQm9keSBib2R5OworICAgICAgICAKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZGVjb2RlZFN0cmVhbTsKKyAgICAgICAgaWYgKE1pbWVVdGlsLkVOQ19CQVNFNjQuZXF1YWxzKGVuYykpIHsKKyAgICAgICAgICAgIGRlY29kZWRTdHJlYW0gPSBuZXcgQmFzZTY0SW5wdXRTdHJlYW0oaXMpOworICAgICAgICB9IGVsc2UgaWYgKE1pbWVVdGlsLkVOQ19RVU9URURfUFJJTlRBQkxFLmVxdWFscyhlbmMpKSB7CisgICAgICAgICAgICBkZWNvZGVkU3RyZWFtID0gbmV3IFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtKGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlY29kZWRTdHJlYW0gPSBpczsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGJkLmdldE1pbWVUeXBlKCkuc3RhcnRzV2l0aCgidGV4dC8iKSkgeworICAgICAgICAgICAgYm9keSA9IGJvZHlGYWN0b3J5LnRleHRCb2R5KGRlY29kZWRTdHJlYW0sIGJkLmdldENoYXJzZXQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib2R5ID0gYm9keUZhY3RvcnkuYmluYXJ5Qm9keShkZWNvZGVkU3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgRW50aXR5IGVudGl0eSA9ICgoRW50aXR5KSBzdGFjay5wZWVrKCkpOworICAgICAgICBlbnRpdHkuc2V0Qm9keShib2R5KTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXIjZW5kTXVsdGlwYXJ0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRNdWx0aXBhcnQoKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiB7CisgICAgICAgIHN0YWNrLnBvcCgpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5Db250ZW50SGFuZGxlciNzdGFydEJvZHlQYXJ0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydEJvZHlQYXJ0KCkgdGhyb3dzIE1pbWVFeGNlcHRpb24geworICAgICAgICBleHBlY3QoTXVsdGlwYXJ0LmNsYXNzKTsKKyAgICAgICAgCisgICAgICAgIEJvZHlQYXJ0IGJvZHlQYXJ0ID0gbmV3IEJvZHlQYXJ0KCk7CisgICAgICAgICgoTXVsdGlwYXJ0KSBzdGFjay5wZWVrKCkpLmFkZEJvZHlQYXJ0KGJvZHlQYXJ0KTsKKyAgICAgICAgc3RhY2sucHVzaChib2R5UGFydCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI2VuZEJvZHlQYXJ0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmRCb2R5UGFydCgpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsKKyAgICAgICAgZXhwZWN0KEJvZHlQYXJ0LmNsYXNzKTsKKyAgICAgICAgc3RhY2sucG9wKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI2VwaWxvZ3VlKGphdmEuaW8uSW5wdXRTdHJlYW0pCisgICAgICovCisgICAgcHVibGljIHZvaWQgZXBpbG9ndWUoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBNaW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGV4cGVjdChNdWx0aXBhcnQuY2xhc3MpOworICAgICAgICBCeXRlU2VxdWVuY2UgYnl0ZXMgPSBsb2FkU3RyZWFtKGlzKTsKKyAgICAgICAgKChNdWx0aXBhcnQpIHN0YWNrLnBlZWsoKSkuc2V0RXBpbG9ndWVSYXcoYnl0ZXMpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5Db250ZW50SGFuZGxlciNwcmVhbWJsZShqYXZhLmlvLklucHV0U3RyZWFtKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHByZWFtYmxlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBleHBlY3QoTXVsdGlwYXJ0LmNsYXNzKTsKKyAgICAgICAgQnl0ZVNlcXVlbmNlIGJ5dGVzID0gbG9hZFN0cmVhbShpcyk7CisgICAgICAgICgoTXVsdGlwYXJ0KSBzdGFjay5wZWVrKCkpLnNldFByZWFtYmxlUmF3KGJ5dGVzKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVW5zdXBwb3J0ZWQuCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXIjcmF3KGphdmEuaW8uSW5wdXRTdHJlYW0pCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmF3KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlU2VxdWVuY2UgbG9hZFN0cmVhbShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJhYiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoNjQpOworCisgICAgICAgIGludCBiOworICAgICAgICB3aGlsZSAoKGIgPSBpbi5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICBiYWIuYXBwZW5kKGIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJhYjsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZVdyaXRlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRlM2YxCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VXcml0ZXIuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLkNvZGVjVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5Db250ZW50VHlwZUZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkZpZWxkTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5CeXRlQXJyYXlCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5CeXRlU2VxdWVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5Db250ZW50VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLk1pbWVVdGlsOworCisvKioKKyAqIFdyaXRlcyBhIG1lc3NhZ2UgKG9yIGEgcGFydCBvZiBhIG1lc3NhZ2UpIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZDsgaW5zdGVhZCB0aGUgc3RhdGljIGluc3RhbmNlCisgKiB7QGxpbmsgI0RFRkFVTFR9IGltcGxlbWVudHMgdGhlIGRlZmF1bHQgc3RyYXRlZ3kgZm9yIHdyaXRpbmcgYSBtZXNzYWdlLgorICogPHA+CisgKiBUaGlzIGNsYXNzIG1heSBiZSBzdWJjbGFzc2VkIHRvIGltcGxlbWVudCBjdXN0b20gc3RyYXRlZ2llcyBmb3Igd3JpdGluZworICogbWVzc2FnZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlV3JpdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDUkxGID0geyAnXHInLCAnXG4nIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERBU0hFUyA9IHsgJy0nLCAnLScgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IG1lc3NhZ2Ugd3JpdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVzc2FnZVdyaXRlciBERUZBVUxUID0gbmV3IE1lc3NhZ2VXcml0ZXIoKTsKKworICAgIC8qKgorICAgICAqIFByb3RlY3RlZCBjb25zdHJ1Y3RvciBwcmV2ZW50cyBkaXJlY3QgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWVzc2FnZVdyaXRlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgc3BlY2lmaWVkIDxjb2RlPkJvZHk8L2NvZGU+IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBib2R5CisgICAgICogICAgICAgICAgICB0aGUgPGNvZGU+Qm9keTwvY29kZT4gdG8gd3JpdGUuCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIE91dHB1dFN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZUJvZHkoQm9keSBib2R5LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYm9keSBpbnN0YW5jZW9mIE1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHdyaXRlRW50aXR5KChNZXNzYWdlKSBib2R5LCBvdXQpOworICAgICAgICB9IGVsc2UgaWYgKGJvZHkgaW5zdGFuY2VvZiBNdWx0aXBhcnQpIHsKKyAgICAgICAgICAgIHdyaXRlTXVsdGlwYXJ0KChNdWx0aXBhcnQpIGJvZHksIG91dCk7CisgICAgICAgIH0gZWxzZSBpZiAoYm9keSBpbnN0YW5jZW9mIFNpbmdsZUJvZHkpIHsKKyAgICAgICAgICAgICgoU2luZ2xlQm9keSkgYm9keSkud3JpdGVUbyhvdXQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGJvZHkgY2xhc3MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgc3BlY2lmaWVkIDxjb2RlPkVudGl0eTwvY29kZT4gdG8gdGhlIHNwZWNpZmllZAorICAgICAqIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4uCisgICAgICogCisgICAgICogQHBhcmFtIGVudGl0eQorICAgICAqICAgICAgICAgICAgdGhlIDxjb2RlPkVudGl0eTwvY29kZT4gdG8gd3JpdGUuCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIE91dHB1dFN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZUVudGl0eShFbnRpdHkgZW50aXR5LCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBIZWFkZXIgaGVhZGVyID0gZW50aXR5LmdldEhlYWRlcigpOworICAgICAgICBpZiAoaGVhZGVyID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIGhlYWRlciIpOworCisgICAgICAgIHdyaXRlSGVhZGVyKGhlYWRlciwgb3V0KTsKKworICAgICAgICBmaW5hbCBCb2R5IGJvZHkgPSBlbnRpdHkuZ2V0Qm9keSgpOworICAgICAgICBpZiAoYm9keSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBib2R5Iik7CisKKyAgICAgICAgYm9vbGVhbiBiaW5hcnlCb2R5ID0gYm9keSBpbnN0YW5jZW9mIEJpbmFyeUJvZHk7CisgICAgICAgIE91dHB1dFN0cmVhbSBlbmNPdXQgPSBlbmNvZGVTdHJlYW0ob3V0LCBlbnRpdHkKKyAgICAgICAgICAgICAgICAuZ2V0Q29udGVudFRyYW5zZmVyRW5jb2RpbmcoKSwgYmluYXJ5Qm9keSk7CisKKyAgICAgICAgd3JpdGVCb2R5KGJvZHksIGVuY091dCk7CisKKyAgICAgICAgLy8gY2xvc2UgaWYgd3JhcHBlZCAoYmFzZTY0IG9yIHF1b3RlZC1wcmludGFibGUpCisgICAgICAgIGlmIChlbmNPdXQgIT0gb3V0KQorICAgICAgICAgICAgZW5jT3V0LmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIHNwZWNpZmllZCA8Y29kZT5NdWx0aXBhcnQ8L2NvZGU+IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBtdWx0aXBhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5NdWx0aXBhcnQ8L2NvZGU+IHRvIHdyaXRlLgorICAgICAqIEBwYXJhbSBvdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVNdWx0aXBhcnQoTXVsdGlwYXJ0IG11bHRpcGFydCwgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbnRlbnRUeXBlRmllbGQgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZShtdWx0aXBhcnQpOworCisgICAgICAgIEJ5dGVTZXF1ZW5jZSBib3VuZGFyeSA9IGdldEJvdW5kYXJ5KGNvbnRlbnRUeXBlKTsKKworICAgICAgICB3cml0ZUJ5dGVzKG11bHRpcGFydC5nZXRQcmVhbWJsZVJhdygpLCBvdXQpOworICAgICAgICBvdXQud3JpdGUoQ1JMRik7CisKKyAgICAgICAgZm9yIChCb2R5UGFydCBib2R5UGFydCA6IG11bHRpcGFydC5nZXRCb2R5UGFydHMoKSkgeworICAgICAgICAgICAgb3V0LndyaXRlKERBU0hFUyk7CisgICAgICAgICAgICB3cml0ZUJ5dGVzKGJvdW5kYXJ5LCBvdXQpOworICAgICAgICAgICAgb3V0LndyaXRlKENSTEYpOworCisgICAgICAgICAgICB3cml0ZUVudGl0eShib2R5UGFydCwgb3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZShDUkxGKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC53cml0ZShEQVNIRVMpOworICAgICAgICB3cml0ZUJ5dGVzKGJvdW5kYXJ5LCBvdXQpOworICAgICAgICBvdXQud3JpdGUoREFTSEVTKTsKKyAgICAgICAgb3V0LndyaXRlKENSTEYpOworCisgICAgICAgIHdyaXRlQnl0ZXMobXVsdGlwYXJ0LmdldEVwaWxvZ3VlUmF3KCksIG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIHNwZWNpZmllZCA8Y29kZT5IZWFkZXI8L2NvZGU+IHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgKiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+LgorICAgICAqIAorICAgICAqIEBwYXJhbSBoZWFkZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSA8Y29kZT5IZWFkZXI8L2NvZGU+IHRvIHdyaXRlLgorICAgICAqIEBwYXJhbSBvdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBPdXRwdXRTdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVIZWFkZXIoSGVhZGVyIGhlYWRlciwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGhlYWRlcikgeworICAgICAgICAgICAgd3JpdGVCeXRlcyhmaWVsZC5nZXRSYXcoKSwgb3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZShDUkxGKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dC53cml0ZShDUkxGKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGVuY29kZVN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgZW5jb2RpbmcsCisgICAgICAgICAgICBib29sZWFuIGJpbmFyeUJvZHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChNaW1lVXRpbC5pc0Jhc2U2NEVuY29kaW5nKGVuY29kaW5nKSkgeworICAgICAgICAgICAgcmV0dXJuIENvZGVjVXRpbC53cmFwQmFzZTY0KG91dCk7CisgICAgICAgIH0gZWxzZSBpZiAoTWltZVV0aWwuaXNRdW90ZWRQcmludGFibGVFbmNvZGVkKGVuY29kaW5nKSkgeworICAgICAgICAgICAgcmV0dXJuIENvZGVjVXRpbC53cmFwUXVvdGVkUHJpbnRhYmxlKG91dCwgYmluYXJ5Qm9keSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250ZW50VHlwZUZpZWxkIGdldENvbnRlbnRUeXBlKE11bHRpcGFydCBtdWx0aXBhcnQpIHsKKyAgICAgICAgRW50aXR5IHBhcmVudCA9IG11bHRpcGFydC5nZXRQYXJlbnQoKTsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgcGFyZW50IGVudGl0eSBpbiBtdWx0aXBhcnQiKTsKKworICAgICAgICBIZWFkZXIgaGVhZGVyID0gcGFyZW50LmdldEhlYWRlcigpOworICAgICAgICBpZiAoaGVhZGVyID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBoZWFkZXIgaW4gcGFyZW50IGVudGl0eSIpOworCisgICAgICAgIENvbnRlbnRUeXBlRmllbGQgY29udGVudFR5cGUgPSAoQ29udGVudFR5cGVGaWVsZCkgaGVhZGVyCisgICAgICAgICAgICAgICAgLmdldEZpZWxkKEZpZWxkTmFtZS5DT05URU5UX1RZUEUpOworICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDb250ZW50LVR5cGUgZmllbGQgbm90IHNwZWNpZmllZCIpOworCisgICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ5dGVTZXF1ZW5jZSBnZXRCb3VuZGFyeShDb250ZW50VHlwZUZpZWxkIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIFN0cmluZyBib3VuZGFyeSA9IGNvbnRlbnRUeXBlLmdldEJvdW5kYXJ5KCk7CisgICAgICAgIGlmIChib3VuZGFyeSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk11bHRpcGFydCBib3VuZGFyeSBub3Qgc3BlY2lmaWVkIik7CisKKyAgICAgICAgcmV0dXJuIENvbnRlbnRVdGlsLmVuY29kZShib3VuZGFyeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQnl0ZXMoQnl0ZVNlcXVlbmNlIGJ5dGVTZXF1ZW5jZSwgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChieXRlU2VxdWVuY2UgaW5zdGFuY2VvZiBCeXRlQXJyYXlCdWZmZXIpIHsKKyAgICAgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBiYWIgPSAoQnl0ZUFycmF5QnVmZmVyKSBieXRlU2VxdWVuY2U7CisgICAgICAgICAgICBvdXQud3JpdGUoYmFiLmJ1ZmZlcigpLCAwLCBiYWIubGVuZ3RoKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0LndyaXRlKGJ5dGVTZXF1ZW5jZS50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL011bHRpcGFydC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL011bHRpcGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYWVjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTXVsdGlwYXJ0LmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ29udGVudFV0aWw7CisKKy8qKgorICogUmVwcmVzZW50cyBhIE1JTUUgbXVsdGlwYXJ0IGJvZHkgKHNlZSBSRkMgMjA0NSkuQSBtdWx0aXBhcnQgYm9keSBoYXMgYQorICogb3JkZXJlZCBsaXN0IG9mIGJvZHkgcGFydHMuIFRoZSBtdWx0aXBhcnQgYm9keSBhbHNvIGhhcyBhIHByZWFtYmxlIGFuZAorICogZXBpbG9ndWUuIFRoZSBwcmVhbWJsZSBjb25zaXN0cyBvZiB3aGF0ZXZlciBjaGFyYWN0ZXJzIGFwcGVhciBiZWZvcmUgdGhlCisgKiBmaXJzdCBib2R5IHBhcnQgd2hpbGUgdGhlIGVwaWxvZ3VlIGNvbnNpc3RzIG9mIHdoYXRldmVyIGNoYXJhY3RlcnMgY29tZSBhZnRlcgorICogdGhlIGxhc3QgYm9keSBwYXJ0LgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwYXJ0IGltcGxlbWVudHMgQm9keSB7CisKKyAgICBwcml2YXRlIExpc3Q8Qm9keVBhcnQ+IGJvZHlQYXJ0cyA9IG5ldyBMaW5rZWRMaXN0PEJvZHlQYXJ0PigpOworICAgIHByaXZhdGUgRW50aXR5IHBhcmVudCA9IG51bGw7CisKKyAgICBwcml2YXRlIEJ5dGVTZXF1ZW5jZSBwcmVhbWJsZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgcHJlYW1ibGVTdHJDYWNoZTsKKyAgICBwcml2YXRlIEJ5dGVTZXF1ZW5jZSBlcGlsb2d1ZTsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgZXBpbG9ndWVTdHJDYWNoZTsKKworICAgIHByaXZhdGUgU3RyaW5nIHN1YlR5cGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGVtcHR5IDxjb2RlPk11bHRpcGFydDwvY29kZT4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE11bHRpcGFydChTdHJpbmcgc3ViVHlwZSkgeworICAgICAgICBwcmVhbWJsZSA9IEJ5dGVTZXF1ZW5jZS5FTVBUWTsKKyAgICAgICAgcHJlYW1ibGVTdHJDYWNoZSA9ICIiOworICAgICAgICBlcGlsb2d1ZSA9IEJ5dGVTZXF1ZW5jZS5FTVBUWTsKKyAgICAgICAgZXBpbG9ndWVTdHJDYWNoZSA9ICIiOworCisgICAgICAgIHRoaXMuc3ViVHlwZSA9IHN1YlR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NdWx0aXBhcnQ8L2NvZGU+IGZyb20gdGhlIHNwZWNpZmllZAorICAgICAqIDxjb2RlPk11bHRpcGFydDwvY29kZT4uIFRoZSA8Y29kZT5NdWx0aXBhcnQ8L2NvZGU+IGluc3RhbmNlIGlzCisgICAgICogaW5pdGlhbGl6ZWQgd2l0aCBjb3BpZXMgb2YgcHJlYW1ibGUsIGVwaWxvZ3VlLCBzdWIgdHlwZSBhbmQgdGhlIGxpc3Qgb2YKKyAgICAgKiBib2R5IHBhcnRzIG9mIHRoZSBzcGVjaWZpZWQgPGNvZGU+TXVsdGlwYXJ0PC9jb2RlPi4gVGhlIHBhcmVudCBlbnRpdHkKKyAgICAgKiBvZiB0aGUgbmV3IG11bHRpcGFydCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gb3RoZXIKKyAgICAgKiAgICAgICAgICAgIG11bHRpcGFydCB0byBjb3B5LgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5vdGhlcjwvY29kZT4gY29udGFpbnMgYSB7QGxpbmsgU2luZ2xlQm9keX0gdGhhdAorICAgICAqICAgICAgICAgICAgIGRvZXMgbm90IHN1cHBvcnQgdGhlIHtAbGluayBTaW5nbGVCb2R5I2NvcHkoKSBjb3B5KCl9CisgICAgICogICAgICAgICAgICAgb3BlcmF0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgPGNvZGU+b3RoZXI8L2NvZGU+IGNvbnRhaW5zIGEgPGNvZGU+Qm9keTwvY29kZT4gdGhhdAorICAgICAqICAgICAgICAgICAgIGlzIG5laXRoZXIgYSB7QGxpbmsgTWVzc2FnZX0sIHtAbGluayBNdWx0aXBhcnR9IG9yCisgICAgICogICAgICAgICAgICAge0BsaW5rIFNpbmdsZUJvZHl9LgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aXBhcnQoTXVsdGlwYXJ0IG90aGVyKSB7CisgICAgICAgIHByZWFtYmxlID0gb3RoZXIucHJlYW1ibGU7CisgICAgICAgIHByZWFtYmxlU3RyQ2FjaGUgPSBvdGhlci5wcmVhbWJsZVN0ckNhY2hlOworICAgICAgICBlcGlsb2d1ZSA9IG90aGVyLmVwaWxvZ3VlOworICAgICAgICBlcGlsb2d1ZVN0ckNhY2hlID0gb3RoZXIuZXBpbG9ndWVTdHJDYWNoZTsKKworICAgICAgICBmb3IgKEJvZHlQYXJ0IG90aGVyQm9keVBhcnQgOiBvdGhlci5ib2R5UGFydHMpIHsKKyAgICAgICAgICAgIEJvZHlQYXJ0IGJvZHlQYXJ0Q29weSA9IG5ldyBCb2R5UGFydChvdGhlckJvZHlQYXJ0KTsKKyAgICAgICAgICAgIGFkZEJvZHlQYXJ0KGJvZHlQYXJ0Q29weSk7CisgICAgICAgIH0KKworICAgICAgICBzdWJUeXBlID0gb3RoZXIuc3ViVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtdWx0aXBhcnQgc3ViLXR5cGUuIEUuZy4gPGNvZGU+YWx0ZXJuYXRpdmU8L2NvZGU+ICh0aGUKKyAgICAgKiBkZWZhdWx0KSBvciA8Y29kZT5wYXJhbGxlbDwvY29kZT4uIFNlZSBSRkMgMjA0NSBmb3IgY29tbW9uIHN1Yi10eXBlcworICAgICAqIGFuZCB0aGVpciBtZWFuaW5nLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIG11bHRpcGFydCBzdWItdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1YlR5cGUoKSB7CisgICAgICAgIHJldHVybiBzdWJUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG11bHRpcGFydCBzdWItdHlwZS4gRS5nLiA8Y29kZT5hbHRlcm5hdGl2ZTwvY29kZT4gb3IKKyAgICAgKiA8Y29kZT5wYXJhbGxlbDwvY29kZT4uIFNlZSBSRkMgMjA0NSBmb3IgY29tbW9uIHN1Yi10eXBlcyBhbmQgdGhlaXIKKyAgICAgKiBtZWFuaW5nLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzdWJUeXBlCisgICAgICogICAgICAgICAgICB0aGUgc3ViLXR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3ViVHlwZShTdHJpbmcgc3ViVHlwZSkgeworICAgICAgICB0aGlzLnN1YlR5cGUgPSBzdWJUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5Cb2R5I2dldFBhcmVudCgpCisgICAgICovCisgICAgcHVibGljIEVudGl0eSBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLkJvZHkjc2V0UGFyZW50KG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuRW50aXR5KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChFbnRpdHkgcGFyZW50KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICBmb3IgKEJvZHlQYXJ0IGJvZHlQYXJ0IDogYm9keVBhcnRzKSB7CisgICAgICAgICAgICBib2R5UGFydC5zZXRQYXJlbnQocGFyZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBib2R5IHBhcnRzLgorICAgICAqIAorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIDxjb2RlPkJvZHlQYXJ0PC9jb2RlPiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBib2R5UGFydHMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGxpc3Qgb2YgYm9keSBwYXJ0cy4gVGhlIGxpc3QgaXMgaW1tdXRhYmxlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgPGNvZGU+Qm9keVBhcnQ8L2NvZGU+IG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8Qm9keVBhcnQ+IGdldEJvZHlQYXJ0cygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoYm9keVBhcnRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIGJvZHkgcGFydHMuCisgICAgICogCisgICAgICogQHBhcmFtIGJvZHlQYXJ0cworICAgICAqICAgICAgICAgICAgdGhlIG5ldyBsaXN0IG9mIDxjb2RlPkJvZHlQYXJ0PC9jb2RlPiBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvZHlQYXJ0cyhMaXN0PEJvZHlQYXJ0PiBib2R5UGFydHMpIHsKKyAgICAgICAgdGhpcy5ib2R5UGFydHMgPSBib2R5UGFydHM7CisgICAgICAgIGZvciAoQm9keVBhcnQgYm9keVBhcnQgOiBib2R5UGFydHMpIHsKKyAgICAgICAgICAgIGJvZHlQYXJ0LnNldFBhcmVudChwYXJlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGJvZHkgcGFydCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGJvZHkgcGFydHMuCisgICAgICogCisgICAgICogQHBhcmFtIGJvZHlQYXJ0CisgICAgICogICAgICAgICAgICB0aGUgYm9keSBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJvZHlQYXJ0KEJvZHlQYXJ0IGJvZHlQYXJ0KSB7CisgICAgICAgIGlmIChib2R5UGFydCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIGJvZHlQYXJ0cy5hZGQoYm9keVBhcnQpOworICAgICAgICBib2R5UGFydC5zZXRQYXJlbnQocGFyZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIGEgYm9keSBwYXJ0IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgYm9keSBwYXJ0cy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYm9keVBhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBib2R5IHBhcnQuCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICBpbmRleCBhdCB3aGljaCB0aGUgc3BlY2lmaWVkIGJvZHkgcGFydCBpcyB0byBiZSBpbnNlcnRlZC4KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlIChpbmRleCAmbHQ7IDAgfHwgaW5kZXggJmd0OworICAgICAqICAgICAgICAgICAgIGdldENvdW50KCkpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEJvZHlQYXJ0KEJvZHlQYXJ0IGJvZHlQYXJ0LCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGJvZHlQYXJ0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgYm9keVBhcnRzLmFkZChpbmRleCwgYm9keVBhcnQpOworICAgICAgICBib2R5UGFydC5zZXRQYXJlbnQocGFyZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBib2R5IHBhcnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgbGlzdCBvZiBib2R5CisgICAgICogcGFydHMuCisgICAgICogCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgYm9keSBwYXJ0IHRvIGJlIHJlbW92ZWQuCisgICAgICogQHJldHVybiB0aGUgcmVtb3ZlZCBib2R5IHBhcnQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSAoaW5kZXggJmx0OyAwIHx8IGluZGV4ICZndDs9CisgICAgICogICAgICAgICAgICAgZ2V0Q291bnQoKSkuCisgICAgICovCisgICAgcHVibGljIEJvZHlQYXJ0IHJlbW92ZUJvZHlQYXJ0KGludCBpbmRleCkgeworICAgICAgICBCb2R5UGFydCBib2R5UGFydCA9IGJvZHlQYXJ0cy5yZW1vdmUoaW5kZXgpOworICAgICAgICBib2R5UGFydC5zZXRQYXJlbnQobnVsbCk7CisgICAgICAgIHJldHVybiBib2R5UGFydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyB0aGUgYm9keSBwYXJ0IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGxpc3Qgb2YgYm9keQorICAgICAqIHBhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBib2R5IHBhcnQuCisgICAgICogCisgICAgICogQHBhcmFtIGJvZHlQYXJ0CisgICAgICogICAgICAgICAgICBib2R5IHBhcnQgdG8gYmUgc3RvcmVkIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICBpbmRleCBvZiBib2R5IHBhcnQgdG8gcmVwbGFjZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXBsYWNlZCBib2R5IHBhcnQuCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSAoaW5kZXggJmx0OyAwIHx8IGluZGV4ICZndDs9CisgICAgICogICAgICAgICAgICAgZ2V0Q291bnQoKSkuCisgICAgICovCisgICAgcHVibGljIEJvZHlQYXJ0IHJlcGxhY2VCb2R5UGFydChCb2R5UGFydCBib2R5UGFydCwgaW50IGluZGV4KSB7CisgICAgICAgIGlmIChib2R5UGFydCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIEJvZHlQYXJ0IHJlcGxhY2VkQm9keVBhcnQgPSBib2R5UGFydHMuc2V0KGluZGV4LCBib2R5UGFydCk7CisgICAgICAgIGlmIChib2R5UGFydCA9PSByZXBsYWNlZEJvZHlQYXJ0KQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZXBsYWNlIGJvZHkgcGFydCB3aXRoIGl0c2VsZiIpOworCisgICAgICAgIGJvZHlQYXJ0LnNldFBhcmVudChwYXJlbnQpOworICAgICAgICByZXBsYWNlZEJvZHlQYXJ0LnNldFBhcmVudChudWxsKTsKKworICAgICAgICByZXR1cm4gcmVwbGFjZWRCb2R5UGFydDsKKyAgICB9CisKKyAgICAvLyBwYWNrYWdlIHByaXZhdGUgZm9yIG5vdzsgbWlnaHQgYmVjb21lIHB1YmxpYyBzb21lZGF5CisgICAgQnl0ZVNlcXVlbmNlIGdldFByZWFtYmxlUmF3KCkgeworICAgICAgICByZXR1cm4gcHJlYW1ibGU7CisgICAgfQorCisgICAgdm9pZCBzZXRQcmVhbWJsZVJhdyhCeXRlU2VxdWVuY2UgcHJlYW1ibGUpIHsKKyAgICAgICAgdGhpcy5wcmVhbWJsZSA9IHByZWFtYmxlOworICAgICAgICB0aGlzLnByZWFtYmxlU3RyQ2FjaGUgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHByZWFtYmxlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdGhlIHByZWFtYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlYW1ibGUoKSB7CisgICAgICAgIGlmIChwcmVhbWJsZVN0ckNhY2hlID09IG51bGwpIHsKKyAgICAgICAgICAgIHByZWFtYmxlU3RyQ2FjaGUgPSBDb250ZW50VXRpbC5kZWNvZGUocHJlYW1ibGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcmVhbWJsZVN0ckNhY2hlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByZWFtYmxlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBwcmVhbWJsZQorICAgICAqICAgICAgICAgICAgdGhlIHByZWFtYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWFtYmxlKFN0cmluZyBwcmVhbWJsZSkgeworICAgICAgICB0aGlzLnByZWFtYmxlID0gQ29udGVudFV0aWwuZW5jb2RlKHByZWFtYmxlKTsKKyAgICAgICAgdGhpcy5wcmVhbWJsZVN0ckNhY2hlID0gcHJlYW1ibGU7CisgICAgfQorCisgICAgLy8gcGFja2FnZSBwcml2YXRlIGZvciBub3c7IG1pZ2h0IGJlY29tZSBwdWJsaWMgc29tZWRheQorICAgIEJ5dGVTZXF1ZW5jZSBnZXRFcGlsb2d1ZVJhdygpIHsKKyAgICAgICAgcmV0dXJuIGVwaWxvZ3VlOworICAgIH0KKworICAgIHZvaWQgc2V0RXBpbG9ndWVSYXcoQnl0ZVNlcXVlbmNlIGVwaWxvZ3VlKSB7CisgICAgICAgIHRoaXMuZXBpbG9ndWUgPSBlcGlsb2d1ZTsKKyAgICAgICAgdGhpcy5lcGlsb2d1ZVN0ckNhY2hlID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBlcGlsb2d1ZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBlcGlsb2d1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVwaWxvZ3VlKCkgeworICAgICAgICBpZiAoZXBpbG9ndWVTdHJDYWNoZSA9PSBudWxsKSB7CisgICAgICAgICAgICBlcGlsb2d1ZVN0ckNhY2hlID0gQ29udGVudFV0aWwuZGVjb2RlKGVwaWxvZ3VlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXBpbG9ndWVTdHJDYWNoZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBlcGlsb2d1ZS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZXBpbG9ndWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBlcGlsb2d1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFcGlsb2d1ZShTdHJpbmcgZXBpbG9ndWUpIHsKKyAgICAgICAgdGhpcy5lcGlsb2d1ZSA9IENvbnRlbnRVdGlsLmVuY29kZShlcGlsb2d1ZSk7CisgICAgICAgIHRoaXMuZXBpbG9ndWVTdHJDYWNoZSA9IGVwaWxvZ3VlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3Bvc2VzIG9mIHRoZSBCb2R5UGFydHMgb2YgdGhpcyBNdWx0aXBhcnQuIE5vdGUgdGhhdCB0aGUgZGlzcG9zZSBjYWxsCisgICAgICogZG9lcyBub3QgZ2V0IGZvcndhcmRlZCB0byB0aGUgcGFyZW50IGVudGl0eSBvZiB0aGlzIE11bHRpcGFydC4KKyAgICAgKiAKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuRGlzcG9zYWJsZSNkaXNwb3NlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICBmb3IgKEJvZHlQYXJ0IGJvZHlQYXJ0IDogYm9keVBhcnRzKSB7CisgICAgICAgICAgICBib2R5UGFydC5kaXNwb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9TaW1wbGVDb250ZW50SGFuZGxlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL1NpbXBsZUNvbnRlbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwYzYyYQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9TaW1wbGVDb250ZW50SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5CYXNlNjRJbnB1dFN0cmVhbTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWMuUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW07DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3IuQm9keURlc2NyaXB0b3I7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkFic3RyYWN0RmllbGQ7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5BYnN0cmFjdENvbnRlbnRIYW5kbGVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRmllbGQ7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuTWltZVV0aWw7DQorDQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQorDQorLyoqDQorICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgQ29udGVudEhhbmRsZXIgdGhhdCBhdXRvbWF0ZXMgY29tbW9uDQorICogdGFza3MuIEN1cnJlbnRseSBwZXJmb3JtcyBoZWFkZXIgcGFyc2luZyBhbmQgYXBwbGllcyBjb250ZW50LXRyYW5zZmVyDQorICogZGVjb2RpbmcgdG8gYm9keSBwYXJ0cy4NCisgKg0KKyAqIA0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVDb250ZW50SGFuZGxlciBleHRlbmRzICBBYnN0cmFjdENvbnRlbnRIYW5kbGVyIHsNCisNCisgICAgLyoqDQorICAgICAqIENhbGxlZCBhZnRlciBoZWFkZXJzIGFyZSBwYXJzZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBoZWFkZXJzKEhlYWRlciBoZWFkZXIpOw0KKw0KKyAgICAvKioNCisgICAgICogQ2FsbGVkIHdoZW4gdGhlIGJvZHkgb2YgYSBkaXNjcmV0ZSAobm9uLW11bHRpcGFydCkgZW50aXR5IGlzIGVuY291bnRlcmVkLg0KKw0KKyAgICAgKiBAcGFyYW0gYmQgZW5jYXBzdWxhdGVzIHRoZSB2YWx1ZXMgKGVpdGhlciByZWFkIGZyb20gdGhlDQorICAgICAqICAgICAgICBtZXNzYWdlIHN0cmVhbSBvciwgaWYgbm90IHByZXNlbnQsIGRldGVybWluZWQgaW1wbGljdGx5DQorICAgICAqICAgICAgICBhcyBkZXNjcmliZWQgaW4gdGhlDQorICAgICAqICAgICAgICBNSU1FIHJmYzpzKSBvZiB0aGUgPGNvZGU+Q29udGVudC1UeXBlPC9jb2RlPiBhbmQNCisgICAgICogICAgICAgIDxjb2RlPkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc8L2NvZGU+IGhlYWRlciBmaWVsZHMuDQorICAgICAqIEBwYXJhbSBpcyB0aGUgY29udGVudHMgb2YgdGhlIGJvZHkuIEJhc2U2NCBvciBxdW90ZWQtcHJpbnRhYmxlDQorICAgICAqICAgICAgICBkZWNvZGluZyB3aWxsIGJlIGFwcGxpZWQgdHJhbnNwYXJlbnRseS4NCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIG9uIEkvTyBlcnJvcnMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBib2R5RGVjb2RlZChCb2R5RGVzY3JpcHRvciBiZCwgSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbjsNCisNCisNCisgICAgLyogSW1wbGVtZW50IGludHJvZHVjZWQgY2FsbGJhY2tzLiAqLw0KKw0KKyAgICBwcml2YXRlIEhlYWRlciBjdXJySGVhZGVyOw0KKw0KKyAgICAvKioNCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQWJzdHJhY3RDb250ZW50SGFuZGxlciNzdGFydEhlYWRlcigpDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGZpbmFsIHZvaWQgc3RhcnRIZWFkZXIoKSB7DQorICAgICAgICBjdXJySGVhZGVyID0gbmV3IEhlYWRlcigpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5BYnN0cmFjdENvbnRlbnRIYW5kbGVyI2ZpZWxkKEZpZWxkKQ0KKyAgICAgKi8NCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZpZWxkKEZpZWxkIGZpZWxkKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiB7DQorICAgICAgICBGaWVsZCBwYXJzZWRGaWVsZCA9IEFic3RyYWN0RmllbGQucGFyc2UoZmllbGQuZ2V0UmF3KCkpOyANCisgICAgICAgIGN1cnJIZWFkZXIuYWRkRmllbGQocGFyc2VkRmllbGQpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5BYnN0cmFjdENvbnRlbnRIYW5kbGVyI2VuZEhlYWRlcigpDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGZpbmFsIHZvaWQgZW5kSGVhZGVyKCkgew0KKyAgICAgICAgSGVhZGVyIHRtcCA9IGN1cnJIZWFkZXI7DQorICAgICAgICBjdXJySGVhZGVyID0gbnVsbDsNCisgICAgICAgIGhlYWRlcnModG1wKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQWJzdHJhY3RDb250ZW50SGFuZGxlciNib2R5KG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3IuQm9keURlc2NyaXB0b3IsIGphdmEuaW8uSW5wdXRTdHJlYW0pDQorICAgICAqLw0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGZpbmFsIHZvaWQgYm9keShCb2R5RGVzY3JpcHRvciBiZCwgSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBpZiAoTWltZVV0aWwuaXNCYXNlNjRFbmNvZGluZyhiZC5nZXRUcmFuc2ZlckVuY29kaW5nKCkpKSB7DQorICAgICAgICAgICAgYm9keURlY29kZWQoYmQsIG5ldyBCYXNlNjRJbnB1dFN0cmVhbShpcykpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSBpZiAoTWltZVV0aWwuaXNRdW90ZWRQcmludGFibGVFbmNvZGVkKGJkLmdldFRyYW5zZmVyRW5jb2RpbmcoKSkpIHsNCisgICAgICAgICAgICBib2R5RGVjb2RlZChiZCwgbmV3IFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtKGlzKSk7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICBib2R5RGVjb2RlZChiZCwgaXMpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9TaW5nbGVCb2R5LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvU2luZ2xlQm9keS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzMzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvU2luZ2xlQm9keS5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIGEgc2luZ2xlIG1lc3NhZ2UgYm9keTsgdGhhdCBpcywgYSBib2R5IHRoYXQgZG9lcworICogbm90IGNvbnRhaW4gKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGFueSBvdGhlciBjaGlsZCBib2RpZXMuIEl0IGFsc28gcHJvdmlkZXMKKyAqIHRoZSBwYXJlbnQgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBieSBib2RpZXMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW5nbGVCb2R5IGltcGxlbWVudHMgQm9keSB7CisKKyAgICBwcml2YXRlIEVudGl0eSBwYXJlbnQgPSBudWxsOworCisgICAgLyoqCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2luZ2xlQm9keSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuQm9keSNnZXRQYXJlbnQoKQorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHkgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5Cb2R5I3NldFBhcmVudChvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLkVudGl0eSkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoRW50aXR5IHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhpcyBzaW5nbGUgYm9keSB0byB0aGUgZ2l2ZW4gc3RyZWFtLgorICAgICAqIAorICAgICAqIEBwYXJhbSBvdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGluIGNhc2Ugb2YgYW4gSS9PIGVycm9yCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIDxjb2RlPlNpbmdsZUJvZHk8L2NvZGU+IChvcHRpb25hbCBvcGVyYXRpb24pLgorICAgICAqIDxwPgorICAgICAqIFRoZSBnZW5lcmFsIGNvbnRyYWN0IG9mIHRoaXMgbWV0aG9kIGlzIGFzIGZvbGxvd3M6CisgICAgICogPHVsPgorICAgICAqIDxsaT5JbnZva2luZyB7QGxpbmsgI2dldFBhcmVudCgpfSBvbiB0aGUgY29weSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIFRoYXQgbWVhbnMgdGhhdCB0aGUgY29weSBpcyBkZXRhY2hlZCBmcm9tIHRoZSBwYXJlbnQgZW50aXR5IG9mIHRoaXMKKyAgICAgKiA8Y29kZT5TaW5nbGVCb2R5PC9jb2RlPi4gVGhlIGNvcHkgbWF5IGdldCBhdHRhY2hlZCB0byBhIGRpZmZlcmVudAorICAgICAqIGVudGl0eSBsYXRlciBvbi48L2xpPgorICAgICAqIDxsaT5UaGUgdW5kZXJseWluZyBjb250ZW50IGRvZXMgbm90IGhhdmUgdG8gYmUgY29waWVkLiBJbnN0ZWFkIGl0IG1heSBiZQorICAgICAqIHNoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIGNvcGllcyBvZiBhIDxjb2RlPlNpbmdsZUJvZHk8L2NvZGU+LjwvbGk+CisgICAgICogPGxpPklmIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgaXMgc2hhcmVkIGJ5IG11bHRpcGxlIGNvcGllcyB0aGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbnRlbnQgZ2V0cyBkZWxldGVkIHdoZW4gdGhlCisgICAgICogbGFzdCBjb3B5IGdldHMgZGlzcG9zZWQgb2YgKGFuZCBub3QgYmVmb3JlIHRoYXQpLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyB0aHJvd3MgYW4KKyAgICAgKiA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4uCisgICAgICogCisgICAgICogQHJldHVybiBhIGNvcHkgb2YgdGhpcyA8Y29kZT5TaW5nbGVCb2R5PC9jb2RlPi4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIDxjb2RlPmNvcHk8L2NvZGU+IG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgICAgICBzaW5nbGUgYm9keS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2luZ2xlQm9keSBjb3B5KCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGhhdmUgYWxsb2NhdGVkIHJlc291cmNlcworICAgICAqIHRoYXQgbmVlZCB0byBiZSBmcmVlZCBleHBsaWNpdGx5IChlLmcuIGNhbm5vdCBiZSBzaW1wbHkgcmVjbGFpbWVkIGJ5IHRoZQorICAgICAqIGdhcmJhZ2UgY29sbGVjdG9yKS4KKyAgICAgKiAKKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCisgICAgICogCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLkRpc3Bvc2FibGUjZGlzcG9zZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9TdG9yYWdlQmluYXJ5Qm9keS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL1N0b3JhZ2VCaW5hcnlCb2R5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2NTg1YgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9TdG9yYWdlQmluYXJ5Qm9keS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLkNvZGVjVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlLk11bHRpUmVmZXJlbmNlU3RvcmFnZTsKKworLyoqCisgKiBCaW5hcnkgYm9keSBiYWNrZWQgYnkgYQorICoge0BsaW5rIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuU3RvcmFnZX0KKyAqLworY2xhc3MgU3RvcmFnZUJpbmFyeUJvZHkgZXh0ZW5kcyBCaW5hcnlCb2R5IHsKKworICAgIHByaXZhdGUgTXVsdGlSZWZlcmVuY2VTdG9yYWdlIHN0b3JhZ2U7CisKKyAgICBwdWJsaWMgU3RvcmFnZUJpbmFyeUJvZHkoZmluYWwgTXVsdGlSZWZlcmVuY2VTdG9yYWdlIHN0b3JhZ2UpIHsKKyAgICAgICAgdGhpcy5zdG9yYWdlID0gc3RvcmFnZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3RvcmFnZS5nZXRJbnB1dFN0cmVhbSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIElucHV0U3RyZWFtIGluID0gc3RvcmFnZS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBDb2RlY1V0aWwuY29weShpbiwgb3V0KTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RvcmFnZUJpbmFyeUJvZHkgY29weSgpIHsKKyAgICAgICAgc3RvcmFnZS5hZGRSZWZlcmVuY2UoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdG9yYWdlQmluYXJ5Qm9keShzdG9yYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIHRoZSBTdG9yYWdlIHRoYXQgaG9sZHMgdGhlIGNvbnRlbnQgb2YgdGhpcyBiaW5hcnkgYm9keS4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5EaXNwb3NhYmxlI2Rpc3Bvc2UoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIGlmIChzdG9yYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0b3JhZ2UuZGVsZXRlKCk7CisgICAgICAgICAgICBzdG9yYWdlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL1N0b3JhZ2VUZXh0Qm9keS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL1N0b3JhZ2VUZXh0Qm9keS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNThjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvU3RvcmFnZVRleHRCb2R5LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWMuQ29kZWNVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2UuTXVsdGlSZWZlcmVuY2VTdG9yYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CisKKy8qKgorICogVGV4dCBib2R5IGJhY2tlZCBieSBhIHtAbGluayBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlLlN0b3JhZ2V9LgorICovCitjbGFzcyBTdG9yYWdlVGV4dEJvZHkgZXh0ZW5kcyBUZXh0Qm9keSB7CisKKyAgICBwcml2YXRlIE11bHRpUmVmZXJlbmNlU3RvcmFnZSBzdG9yYWdlOworICAgIHByaXZhdGUgQ2hhcnNldCBjaGFyc2V0OworCisgICAgcHVibGljIFN0b3JhZ2VUZXh0Qm9keShNdWx0aVJlZmVyZW5jZVN0b3JhZ2Ugc3RvcmFnZSwgQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2U7CisgICAgICAgIHRoaXMuY2hhcnNldCA9IGNoYXJzZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNaW1lQ2hhcnNldCgpIHsKKyAgICAgICAgcmV0dXJuIENoYXJzZXRVdGlsLnRvTWltZUNoYXJzZXQoY2hhcnNldC5uYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdG9yYWdlLmdldElucHV0U3RyZWFtKCksIGNoYXJzZXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIElucHV0U3RyZWFtIGluID0gc3RvcmFnZS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBDb2RlY1V0aWwuY29weShpbiwgb3V0KTsKKyAgICAgICAgaW4uY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RvcmFnZVRleHRCb2R5IGNvcHkoKSB7CisgICAgICAgIHN0b3JhZ2UuYWRkUmVmZXJlbmNlKCk7CisgICAgICAgIHJldHVybiBuZXcgU3RvcmFnZVRleHRCb2R5KHN0b3JhZ2UsIGNoYXJzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgdGhlIFN0b3JhZ2UgdGhhdCBob2xkcyB0aGUgY29udGVudCBvZiB0aGlzIHRleHQgYm9keS4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZS5EaXNwb3NhYmxlI2Rpc3Bvc2UoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgIGlmIChzdG9yYWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0b3JhZ2UuZGVsZXRlKCk7CisgICAgICAgICAgICBzdG9yYWdlID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL1N0cmluZ1RleHRCb2R5LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvU3RyaW5nVGV4dEJvZHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWNkMDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL1N0cmluZ1RleHRCb2R5LmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNoYXJzZXRVdGlsOworCisvKioKKyAqIFRleHQgYm9keSBiYWNrZWQgYnkgYSA8Y29kZT5TdHJpbmc8L2NvZGU+LgorICovCitjbGFzcyBTdHJpbmdUZXh0Qm9keSBleHRlbmRzIFRleHRCb2R5IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDaGFyc2V0IGNoYXJzZXQ7CisKKyAgICBwdWJsaWMgU3RyaW5nVGV4dEJvZHkoZmluYWwgU3RyaW5nIHRleHQsIENoYXJzZXQgY2hhcnNldCkgeworICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWltZUNoYXJzZXQoKSB7CisgICAgICAgIHJldHVybiBDaGFyc2V0VXRpbC50b01pbWVDaGFyc2V0KGNoYXJzZXQubmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKHRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIFJlYWRlciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRleHQpOworICAgICAgICBXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIGNoYXJzZXQpOworCisgICAgICAgIGNoYXIgYnVmZmVyW10gPSBuZXcgY2hhclsxMDI0XTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBuQ2hhcnMgPSByZWFkZXIucmVhZChidWZmZXIpOworICAgICAgICAgICAgaWYgKG5DaGFycyA9PSAtMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGJ1ZmZlciwgMCwgbkNoYXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nVGV4dEJvZHkgY29weSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdUZXh0Qm9keSh0ZXh0LCBjaGFyc2V0KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9UZXh0Qm9keS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL1RleHRCb2R5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2NjlmNAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9UZXh0Qm9keS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uUmVhZGVyOw0KKw0KKy8qKg0KKyAqIEVuY2Fwc3VsYXRlcyB0aGUgY29udGVudHMgb2YgYSA8Y29kZT50ZXh0Lyo8L2NvZGU+IGVudGl0eSBib2R5Lg0KKyAqLw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXh0Qm9keSBleHRlbmRzIFNpbmdsZUJvZHkgew0KKw0KKyAgICAvKioNCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBUZXh0Qm9keSgpIHsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgTUlNRSBjaGFyc2V0IG9mIHRoaXMgdGV4dCBib2R5Lg0KKyAgICAgKiANCisgICAgICogQHJldHVybiB0aGUgTUlNRSBjaGFyc2V0Lg0KKyAgICAgKi8NCisgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRNaW1lQ2hhcnNldCgpOw0KKw0KKyAgICAvKioNCisgICAgICogR2V0cyBhIDxjb2RlPlJlYWRlcjwvY29kZT4gd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmVhZCBvdXQgdGhlIGNvbnRlbnRzDQorICAgICAqIG9mIHRoaXMgYm9keS4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlJlYWRlcjwvY29kZT4uDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24NCisgICAgICogICAgICAgICAgICAgb24gSS9PIGVycm9ycy4NCisgICAgICovDQorICAgIHB1YmxpYyBhYnN0cmFjdCBSZWFkZXIgZ2V0UmVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uOw0KKw0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9BYnN0cmFjdENvbnRlbnRIYW5kbGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9BYnN0cmFjdENvbnRlbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViZWRhMQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL0Fic3RyYWN0Q29udGVudEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkJvZHlEZXNjcmlwdG9yOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KKw0KKy8qKg0KKyAqIEFic3RyYWN0IDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPiB3aXRoIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIGFsbA0KKyAqIHRoZSBtZXRob2RzIG9mIHRoZSA8Y29kZT5Db250ZW50SGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlLg0KKyAqIA0KKyAqIFRoZSBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcuDQorICovDQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGVudEhhbmRsZXIgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlciB7DQorICAgIA0KKyAgICAvKioNCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXIjZW5kTXVsdGlwYXJ0KCkNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGVuZE11bHRpcGFydCgpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI3N0YXJ0TXVsdGlwYXJ0KG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3IuQm9keURlc2NyaXB0b3IpDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzdGFydE11bHRpcGFydChCb2R5RGVzY3JpcHRvciBiZCkgdGhyb3dzIE1pbWVFeGNlcHRpb24gew0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXIjYm9keShvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkJvZHlEZXNjcmlwdG9yLCBqYXZhLmlvLklucHV0U3RyZWFtKQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgYm9keShCb2R5RGVzY3JpcHRvciBiZCwgSW5wdXRTdHJlYW0gaXMpDQorICAgICAgICAgICAgdGhyb3dzIE1pbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI2VuZEJvZHlQYXJ0KCkNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGVuZEJvZHlQYXJ0KCkgdGhyb3dzIE1pbWVFeGNlcHRpb24gew0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXIjZW5kSGVhZGVyKCkNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIGVuZEhlYWRlcigpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI2VuZE1lc3NhZ2UoKQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZW5kTWVzc2FnZSgpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI2VwaWxvZ3VlKGphdmEuaW8uSW5wdXRTdHJlYW0pDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBlcGlsb2d1ZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIE1pbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI2ZpZWxkKEZpZWxkKQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgZmllbGQoRmllbGQgZmllbGQpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI3ByZWFtYmxlKGphdmEuaW8uSW5wdXRTdHJlYW0pDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBwcmVhbWJsZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIE1pbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI3N0YXJ0Qm9keVBhcnQoKQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgc3RhcnRCb2R5UGFydCgpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI3N0YXJ0SGVhZGVyKCkNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0SGVhZGVyKCkgdGhyb3dzIE1pbWVFeGNlcHRpb24gew0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXIjc3RhcnRNZXNzYWdlKCkNCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TWVzc2FnZSgpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEBzZWUgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkNvbnRlbnRIYW5kbGVyI3JhdyhqYXZhLmlvLklucHV0U3RyZWFtKQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgcmF3KElucHV0U3RyZWFtIGlzKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gew0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL0Fic3RyYWN0RW50aXR5LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9BYnN0cmFjdEVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OGFmNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9BYnN0cmFjdEVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMzg5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvci5Cb2R5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkRlZmF1bHRCb2R5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLk1heGltYWxCb2R5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLk11dGFibGVCb2R5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5MaW5lUmVhZGVySW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uTWF4SGVhZGVyTGltaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uTWF4TGluZUxpbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZUFycmF5QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CisKKy8qKgorICogQWJzdHJhY3QgTUlNRSBlbnRpdHkuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eSBpbXBsZW1lbnRzIEVudGl0eVN0YXRlTWFjaGluZSB7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgTG9nIGxvZzsKKyAgICAKKyAgICBwcm90ZWN0ZWQgZmluYWwgQm9keURlc2NyaXB0b3IgcGFyZW50OworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgc3RhcnRTdGF0ZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGVuZFN0YXRlOworICAgIHByb3RlY3RlZCBmaW5hbCBNaW1lRW50aXR5Q29uZmlnIGNvbmZpZzsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIGJvZHk7CisgICAgCisgICAgcHJvdGVjdGVkIGludCBzdGF0ZTsKKworICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5QnVmZmVyIGxpbmVidWY7CisKKyAgICBwcml2YXRlIGludCBsaW5lQ291bnQ7CisgICAgcHJpdmF0ZSBGaWVsZCBmaWVsZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gZW5kT2ZIZWFkZXI7CisgICAgcHJpdmF0ZSBpbnQgaGVhZGVyQ291bnQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaXRTZXQgZmllbGRDaGFycyA9IG5ldyBCaXRTZXQoKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoaW50IGkgPSAweDIxOyBpIDw9IDB4Mzk7IGkrKykgeworICAgICAgICAgICAgZmllbGRDaGFycy5zZXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDB4M2I7IGkgPD0gMHg3ZTsgaSsrKSB7CisgICAgICAgICAgICBmaWVsZENoYXJzLnNldChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVybmFsIHN0YXRlLCBub3QgZXhwb3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9JTl9CT0RZUEFSVCA9IC0yOworICAgIC8qKgorICAgICAqIEludGVybmFsIHN0YXRlLCBub3QgZXhwb3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVF9JTl9NRVNTQUdFID0gLTM7CisKKyAgICBBYnN0cmFjdEVudGl0eSgKKyAgICAgICAgICAgIEJvZHlEZXNjcmlwdG9yIHBhcmVudCwKKyAgICAgICAgICAgIGludCBzdGFydFN0YXRlLCAKKyAgICAgICAgICAgIGludCBlbmRTdGF0ZSwKKyAgICAgICAgICAgIE1pbWVFbnRpdHlDb25maWcgY29uZmlnKSB7CisgICAgICAgIHRoaXMubG9nID0gTG9nRmFjdG9yeS5nZXRMb2coZ2V0Q2xhc3MoKSk7ICAgICAgICAKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIHRoaXMuc3RhdGUgPSBzdGFydFN0YXRlOworICAgICAgICB0aGlzLnN0YXJ0U3RhdGUgPSBzdGFydFN0YXRlOworICAgICAgICB0aGlzLmVuZFN0YXRlID0gZW5kU3RhdGU7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgICAgICB0aGlzLmJvZHkgPSBuZXdCb2R5RGVzY3JpcHRvcihwYXJlbnQpOworICAgICAgICB0aGlzLmxpbmVidWYgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDY0KTsKKyAgICAgICAgdGhpcy5saW5lQ291bnQgPSAwOworICAgICAgICB0aGlzLmVuZE9mSGVhZGVyID0gZmFsc2U7CisgICAgICAgIHRoaXMuaGVhZGVyQ291bnQgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQm9keURlc2NyaXB0b3J9LiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZQorICAgICAqIHRoaXMgaW4gb3JkZXIgdG8gY3JlYXRlIGJvZHkgZGVzY3JpcHRvcnMsIHRoYXQgcHJvdmlkZSBtb3JlIHNwZWNpZmljCisgICAgICogaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIE11dGFibGVCb2R5RGVzY3JpcHRvciBuZXdCb2R5RGVzY3JpcHRvcihCb2R5RGVzY3JpcHRvciBwUGFyZW50KSB7CisgICAgICAgIGZpbmFsIE11dGFibGVCb2R5RGVzY3JpcHRvciByZXN1bHQ7CisgICAgICAgIGlmIChjb25maWcuaXNNYXhpbWFsQm9keURlc2NyaXB0b3IoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE1heGltYWxCb2R5RGVzY3JpcHRvcihwUGFyZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBEZWZhdWx0Qm9keURlc2NyaXB0b3IocFBhcmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIG9yIDxjb2RlPi0xPC9jb2RlPiBpZiBsaW5lIG51bWJlcgorICAgICAqIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRMaW5lTnVtYmVyKCk7CisgICAgCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IExpbmVSZWFkZXJJbnB1dFN0cmVhbSBnZXREYXRhU3RyZWFtKCk7CisgICAgCisgICAgcHJpdmF0ZSBCeXRlQXJyYXlCdWZmZXIgZmlsbEZpZWxkQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNaW1lRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGVuZE9mSGVhZGVyKSAKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKworICAgICAgICBpbnQgbWF4TGluZUxlbiA9IGNvbmZpZy5nZXRNYXhMaW5lTGVuKCk7CisgICAgICAgIExpbmVSZWFkZXJJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IGdldERhdGFTdHJlYW0oKTsKKyAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGZpZWxkYnVmID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcig2NCk7CisKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBzdGlsbCBkYXRhIHN0dWNrIGluIHRoZSBsaW5lIGJ1ZmZlcgorICAgICAgICAgICAgLy8gY29weSBpdCB0byB0aGUgZmllbGQgYnVmZmVyCisgICAgICAgICAgICBpbnQgbGVuID0gbGluZWJ1Zi5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChtYXhMaW5lTGVuID4gMCAmJiBmaWVsZGJ1Zi5sZW5ndGgoKSArIGxlbiA+PSBtYXhMaW5lTGVuKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1heExpbmVMaW1pdEV4Y2VwdGlvbigiTWF4aW11bSBsaW5lIGxlbmd0aCBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBmaWVsZGJ1Zi5hcHBlbmQobGluZWJ1Zi5idWZmZXIoKSwgMCwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmVidWYuY2xlYXIoKTsKKyAgICAgICAgICAgIGlmIChpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIG1vbml0b3IoRXZlbnQuSEVBREVSU19QUkVNQVRVUkVfRU5EKTsKKyAgICAgICAgICAgICAgICBlbmRPZkhlYWRlciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gPSBsaW5lYnVmLmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgbGluZWJ1Zi5ieXRlQXQobGVuIC0gMSkgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgbGluZWJ1Zi5ieXRlQXQobGVuIC0gMSkgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gZW1wdHkgbGluZSBkZXRlY3RlZCAKKyAgICAgICAgICAgICAgICBlbmRPZkhlYWRlciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lQ291bnQrKzsKKyAgICAgICAgICAgIGlmIChsaW5lQ291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgaW50IGNoID0gbGluZWJ1Zi5ieXRlQXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKGNoICE9IENoYXJzZXRVdGlsLlNQICYmIGNoICE9IENoYXJzZXRVdGlsLkhUKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5ldyBoZWFkZXIgZGV0ZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZpZWxkYnVmOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlRmllbGQoKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbWF4SGVhZGVyTGltaXQgPSBjb25maWcuZ2V0TWF4SGVhZGVyQ291bnQoKTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgaWYgKGVuZE9mSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhlYWRlckNvdW50ID49IG1heEhlYWRlckxpbWl0KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1heEhlYWRlckxpbWl0RXhjZXB0aW9uKCJNYXhpbXVtIGhlYWRlciBsaW1pdCBleGNlZWRlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCeXRlQXJyYXlCdWZmZXIgZmllbGRidWYgPSBmaWxsRmllbGRCdWZmZXIoKTsKKyAgICAgICAgICAgIGhlYWRlckNvdW50Kys7CisKKyAgICAgICAgICAgIC8vIFN0cmlwIGF3YXkgbGluZSBkZWxpbWl0ZXIKKyAgICAgICAgICAgIGludCBsZW4gPSBmaWVsZGJ1Zi5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIGZpZWxkYnVmLmJ5dGVBdChsZW4gLSAxKSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGVuID4gMCAmJiBmaWVsZGJ1Zi5ieXRlQXQobGVuIC0gMSkgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmllbGRidWYuc2V0TGVuZ3RoKGxlbik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgcG9zID0gZmllbGRidWYuaW5kZXhPZigoYnl0ZSkgJzonKTsKKyAgICAgICAgICAgIGlmIChwb3MgPD0gMCkgeworICAgICAgICAgICAgICAgIG1vbml0b3IoRXZlbnQuSU5BTElEX0hFQURFUik7CisgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3M7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkQ2hhcnMuZ2V0KGZpZWxkYnVmLmJ5dGVBdChpKSAmIDB4ZmYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yKEV2ZW50LklOQUxJRF9IRUFERVIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbGlkKSB7CisgICAgICAgICAgICAgICAgZmllbGQgPSBuZXcgUmF3RmllbGQoZmllbGRidWYsIHBvcyk7CisgICAgICAgICAgICAgICAgYm9keS5hZGRGaWVsZChmaWVsZCk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5HZXRzIGEgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgZW50aXR5LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHZhbGlkIGlmIHtAbGluayAjZ2V0U3RhdGUoKX0gcmV0dXJuczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgRW50aXR5U3RhdGVzI1RfQk9EWX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgRW50aXR5U3RhdGVzI1RfU1RBUlRfTVVMVElQQVJUfTwvbGk+CisgICAgICogPGxpPntAbGluayBFbnRpdHlTdGF0ZXMjVF9FUElMT0dVRX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgRW50aXR5U3RhdGVzI1RfUFJFQU1CTEV9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIEByZXR1cm4gPGNvZGU+Qm9keURlc2NyaXB0b3I8L2NvZGU+LCBub3QgbnVsbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9keURlc2NyaXB0b3IgZ2V0Qm9keURlc2NyaXB0b3IoKSB7CisgICAgICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgeworICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0JPRFk6CisgICAgICAgIGNhc2UgRW50aXR5U3RhdGVzLlRfU1RBUlRfTVVMVElQQVJUOgorICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX1BSRUFNQkxFOgorICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0VQSUxPR1VFOgorICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0VORF9PRl9TVFJFQU06CisgICAgICAgICAgICByZXR1cm4gYm9keTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgc3RhdGUgOiIgKyBzdGF0ZVRvU3RyaW5nKHN0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB2YWxpZCwgaWYge0BsaW5rICNnZXRTdGF0ZSgpfSByZXR1cm5zIHtAbGluayBFbnRpdHlTdGF0ZXMjVF9GSUVMRH0uCisgICAgICogQHJldHVybiBTdHJpbmcgd2l0aCB0aGUgZmllbGRzIHJhdyBjb250ZW50cy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7QGxpbmsgI2dldFN0YXRlKCl9IHJldHVybnMgYW5vdGhlcgorICAgICAqICAgdmFsdWUgdGhhbiB7QGxpbmsgRW50aXR5U3RhdGVzI1RfRklFTER9LgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZCBnZXRGaWVsZCgpIHsKKyAgICAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CisgICAgICAgIGNhc2UgRW50aXR5U3RhdGVzLlRfRklFTEQ6CisgICAgICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIHN0YXRlIDoiICsgc3RhdGVUb1N0cmluZyhzdGF0ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTW9uaXRvcnMgdGhlIGdpdmVuIGV2ZW50LgorICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHBlcmZvcm0gYWN0aW9ucyB1cG9uIGV2ZW50cy4KKyAgICAgKiBCYXNlIGltcGxlbWVudGF0aW9uIGxvZ3MgYXQgd2Fybi4KKyAgICAgKiBAcGFyYW0gZXZlbnQgPGNvZGU+RXZlbnQ8L2NvZGU+LCBub3QgbnVsbAorICAgICAqIEB0aHJvd3MgTWltZUV4Y2VwdGlvbiBzdWJjbGFzc2VzIG1heSBlbGVjdCB0byB0aHJvdyB0aGlzIGV4Y2VwdGlvbiB1cG9uCisgICAgICogaW52YWxpZCBjb250ZW50CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzdWJjbGFzc2VzIG1heSBlbGVjdCB0byB0aHJvdyB0aGlzIGV4Y2VwdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG1vbml0b3IoRXZlbnQgZXZlbnQpIHRocm93cyBNaW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb25maWcuaXNTdHJpY3RQYXJzaW5nKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNaW1lUGFyc2VFdmVudEV4Y2VwdGlvbihldmVudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YXJuKGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluZGljYXRpdmUgbWVzc2FnZSBzdWl0YWJsZSBmb3IgZGlzcGxheQorICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBldmVudCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN5c3RlbS4KKyAgICAgKiBAcGFyYW0gZXZlbnQgPGNvZGU+RXZlbnQ8L2NvZGU+LCBub3QgbnVsbAorICAgICAqIEByZXR1cm4gbWVzc2FnZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgbWVzc2FnZSBpbiBhbiBleGNlcHRpb24KKyAgICAgKiBvciBmb3IgbG9nZ2luZworICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZShFdmVudCBldmVudCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiRXZlbnQgaXMgdW5leHBlY3RlZGx5IG51bGwuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBldmVudC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGxpbmVOdW1iZXIgPSBnZXRMaW5lTnVtYmVyKCk7CisgICAgICAgIGlmIChsaW5lTnVtYmVyIDw9IDApCisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuICJMaW5lICIgKyBsaW5lTnVtYmVyICsgIjogIiArIG1lc3NhZ2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExvZ3MgKGF0IHdhcm4pIGFuIGluZGljYXRpdmUgbWVzc2FnZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gZXZlbnQgCisgICAgICogYW5kIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXN0ZW0uCisgICAgICogQHBhcmFtIGV2ZW50IDxjb2RlPkV2ZW50PC9jb2RlPiwgbm90IG51bGwKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCB3YXJuKEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChsb2cuaXNXYXJuRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBsb2cud2FybihtZXNzYWdlKGV2ZW50KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTG9ncyAoYXQgZGVidWcpIGFuIGluZGljYXRpdmUgbWVzc2FnZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gZXZlbnQKKyAgICAgKiBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHN5c3RlbS4KKyAgICAgKiBAcGFyYW0gZXZlbnQgPGNvZGU+RXZlbnQ8L2NvZGU+LCBub3QgbnVsbAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGRlYnVnKEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKG1lc3NhZ2UoZXZlbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgWyIgKyBzdGF0ZVRvU3RyaW5nKHN0YXRlKQorICAgICAgICArICJdWyIgKyBib2R5LmdldE1pbWVUeXBlKCkgKyAiXVsiICsgYm9keS5nZXRCb3VuZGFyeSgpICsgIl0iOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlcnMgYSBzdGF0ZSBhcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgbG9nZ2luZy4KKyAgICAgKiBAcGFyYW0gc3RhdGUgCisgICAgICogQHJldHVybiByZW5kZXJlZCBhcyBzdHJpbmcsIG5vdCBudWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RhdGVUb1N0cmluZyhpbnQgc3RhdGUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdDsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9FTkRfT0ZfU1RSRUFNOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJFbmQgb2Ygc3RyZWFtIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRW50aXR5U3RhdGVzLlRfU1RBUlRfTUVTU0FHRToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiU3RhcnQgbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0VORF9NRVNTQUdFOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJFbmQgbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX1JBV19FTlRJVFk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlJhdyBlbnRpdHkiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9IRUFERVI6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlN0YXJ0IGhlYWRlciI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0ZJRUxEOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJGaWVsZCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0VORF9IRUFERVI6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkVuZCBoZWFkZXIiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NVUxUSVBBUlQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIlN0YXJ0IG11bHRpcGFydCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0VORF9NVUxUSVBBUlQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkVuZCBtdWx0aXBhcnQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9QUkVBTUJMRToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiUHJlYW1ibGUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9FUElMT0dVRToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiRXBpbG9ndWUiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9CT0RZUEFSVDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiU3RhcnQgYm9keXBhcnQiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9FTkRfQk9EWVBBUlQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkVuZCBib2R5cGFydCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0JPRFk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkJvZHkiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUX0lOX0JPRFlQQVJUOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJCb2R5cGFydCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRfSU5fTUVTU0FHRToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiSW4gbWVzc2FnZSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJVbmtub3duIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL0NvbnRlbnRIYW5kbGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9Db250ZW50SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YmIyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9Db250ZW50SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3IuQm9keURlc2NyaXB0b3I7DQorDQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQorDQorLyoqDQorICogPHA+DQorICogUmVjZWl2ZXMgbm90aWZpY2F0aW9ucyBvZiB0aGUgY29udGVudCBvZiBhIHBsYWluIFJGQzgyMiBvciBNSU1FIG1lc3NhZ2UuDQorICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFuZCByZWdpc3RlciBhbiBpbnN0YW5jZSBvZiB0aGF0IGltcGxlbWVudGF0aW9uDQorICogd2l0aCBhIDxjb2RlPk1pbWVTdHJlYW1QYXJzZXI8L2NvZGU+IGluc3RhbmNlIHVzaW5nIGl0cyANCisgKiB7QGxpbmsgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLk1pbWVTdHJlYW1QYXJzZXIjc2V0Q29udGVudEhhbmRsZXIoQ29udGVudEhhbmRsZXIpfQ0KKyAqIG1ldGhvZC4gVGhlIHBhcnNlciB1c2VzIHRoZSA8Y29kZT5Db250ZW50SGFuZGxlcjwvY29kZT4gaW5zdGFuY2UgdG8gcmVwb3J0DQorICogYmFzaWMgbWVzc2FnZS1yZWxhdGVkIGV2ZW50cyBsaWtlIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBib2R5IG9mIGENCisgKiBwYXJ0IGluIGEgbXVsdGlwYXJ0IE1JTUUgZW50aXR5Lg0KKyAqIDwvcD4NCisgKiA8cD4NCisgKiBUaHJvd2luZyBhbiBleGNlcHRpb24gZnJvbSBhbiBldmVudCBtZXRob2Qgd2lsbCB0ZXJtaW5hdGUgdGhlIG1lc3NhZ2UNCisgKiBwcm9jZXNzaW5nLCBpLmUuIG5vIG5ldyBldmVudHMgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoYXQgbWVzc2FnZS4gDQorICogPHA+DQorICogRXZlbnRzIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHRoZSBvcmRlciB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50cyBvY2N1ciBpbg0KKyAqIHRoZSBtZXNzYWdlIHN0cmVhbSBwYXJzZWQgYnkgdGhlIHBhcnNlci4gRS5nLjoNCisgKiA8cHJlPg0KKyAqICAgICAgc3RhcnRNZXNzYWdlKCkNCisgKiAgICAgICAgICBzdGFydEhlYWRlcigpDQorICogICAgICAgICAgICAgIGZpZWxkKC4uLikNCisgKiAgICAgICAgICAgICAgZmllbGQoLi4uKQ0KKyAqICAgICAgICAgICAgICAuLi4NCisgKiAgICAgICAgICBlbmRIZWFkZXIoKQ0KKyAqICAgICAgICAgIHN0YXJ0TXVsdGlwYXJ0KCkNCisgKiAgICAgICAgICAgICAgcHJlYW1ibGUoLi4uKQ0KKyAqICAgICAgICAgICAgICBzdGFydEJvZHlQYXJ0KCkNCisgKiAgICAgICAgICAgICAgICAgIHN0YXJ0SGVhZGVyKCkNCisgKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZCguLi4pDQorICogICAgICAgICAgICAgICAgICAgICAgZmllbGQoLi4uKQ0KKyAqICAgICAgICAgICAgICAgICAgICAgIC4uLg0KKyAqICAgICAgICAgICAgICAgICAgZW5kSGVhZGVyKCkNCisgKiAgICAgICAgICAgICAgICAgIGJvZHkoKQ0KKyAqICAgICAgICAgICAgICBlbmRCb2R5UGFydCgpDQorICogICAgICAgICAgICAgIHN0YXJ0Qm9keVBhcnQoKQ0KKyAqICAgICAgICAgICAgICAgICAgc3RhcnRIZWFkZXIoKQ0KKyAqICAgICAgICAgICAgICAgICAgICAgIGZpZWxkKC4uLikNCisgKiAgICAgICAgICAgICAgICAgICAgICBmaWVsZCguLi4pDQorICogICAgICAgICAgICAgICAgICAgICAgLi4uDQorICogICAgICAgICAgICAgICAgICBlbmRIZWFkZXIoKQ0KKyAqICAgICAgICAgICAgICAgICAgYm9keSgpDQorICogICAgICAgICAgICAgIGVuZEJvZHlQYXJ0KCkNCisgKiAgICAgICAgICAgICAgZXBpbG9ndWUoLi4uKQ0KKyAqICAgICAgICAgIGVuZE11bHRpcGFydCgpDQorICogICAgICBlbmRNZXNzYWdlKCkNCisgKiA8L3ByZT4NCisgKiBUaGUgYWJvdmUgc2hvd3MgYW4gZXhhbXBsZSBvZiBhIE1JTUUgbWVzc2FnZSBjb25zaXN0aW5nIG9mIGEgbXVsdGlwYXJ0DQorICogYm9keSBjb250YWluaW5nIHR3byBib2R5IHBhcnRzLg0KKyAqIDwvcD4NCisgKiA8cD4NCisgKiBTZWUgTUlNRSBSRkNzIDIwNDUtMjA0OSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3RydWN0dXJlIG9mIE1JTUUgDQorICogbWVzc2FnZXMgYW5kIFJGQyA4MjIgYW5kIDI4MjIgZm9yIHRoZSBnZW5lcmFsIHN0cnVjdHVyZSBvZiBJbnRlcm5ldCBtYWlsDQorICogbWVzc2FnZXMuDQorICogPC9wPg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgQ29udGVudEhhbmRsZXIgew0KKw0KKyAgICAvKioNCisgICAgICogQ2FsbGVkIHdoZW4gYSBuZXcgbWVzc2FnZSBzdGFydHMgKGEgdG9wIGxldmVsIG1lc3NhZ2Ugb3IgYW4gZW1iZWRkZWQgDQorICAgICAqIHJmYzgyMiBtZXNzYWdlKS4NCisgICAgICoNCisgICAgICogQHRocm93cyBNaW1lRXhjZXB0aW9uIG9uIHByb2Nlc3NpbmcgZXJyb3JzDQorICAgICAqLw0KKyAgICB2b2lkIHN0YXJ0TWVzc2FnZSgpIHRocm93cyBNaW1lRXhjZXB0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQ2FsbGVkIHdoZW4gYSBtZXNzYWdlIGVuZHMuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgTWltZUV4Y2VwdGlvbiBvbiBwcm9jZXNzaW5nIGVycm9ycw0KKyAgICAgKi8NCisgICAgdm9pZCBlbmRNZXNzYWdlKCkgdGhyb3dzIE1pbWVFeGNlcHRpb247DQorDQorICAgIC8qKg0KKyAgICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBib2R5IHBhcnQgc3RhcnRzIGluc2lkZSBhDQorICAgICAqIDxjb2RlPm11bHRpcGFydC8qPC9jb2RlPiBlbnRpdHkuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgTWltZUV4Y2VwdGlvbiBvbiBwcm9jZXNzaW5nIGVycm9ycw0KKyAgICAgKi8NCisgICAgdm9pZCBzdGFydEJvZHlQYXJ0KCkgdGhyb3dzIE1pbWVFeGNlcHRpb247DQorDQorICAgIC8qKg0KKyAgICAgKiBDYWxsZWQgd2hlbiBhIGJvZHkgcGFydCBlbmRzLg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIE1pbWVFeGNlcHRpb24gb24gcHJvY2Vzc2luZyBlcnJvcnMNCisgICAgICovDQorICAgIHZvaWQgZW5kQm9keVBhcnQoKSB0aHJvd3MgTWltZUV4Y2VwdGlvbjsNCisNCisgICAgLyoqDQorICAgICAqIENhbGxlZCB3aGVuIGEgaGVhZGVyIChvZiBhIG1lc3NhZ2Ugb3IgYm9keSBwYXJ0KSBpcyBhYm91dCB0byBiZSBwYXJzZWQuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgTWltZUV4Y2VwdGlvbiBvbiBwcm9jZXNzaW5nIGVycm9ycw0KKyAgICAgKi8NCisgICAgdm9pZCBzdGFydEhlYWRlcigpIHRocm93cyBNaW1lRXhjZXB0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQ2FsbGVkIGZvciBlYWNoIGZpZWxkIG9mIGEgaGVhZGVyLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGZpZWxkIHRoZSBNSU1FIGZpZWxkLg0KKyAgICAgKiBAdGhyb3dzIE1pbWVFeGNlcHRpb24gb24gcHJvY2Vzc2luZyBlcnJvcnMNCisgICAgICovDQorICAgIHZvaWQgZmllbGQoRmllbGQgZmllbGQpIHRocm93cyBNaW1lRXhjZXB0aW9uOw0KKw0KKyAgICAvKioNCisgICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgYXJlIG5vIG1vcmUgaGVhZGVyIGZpZWxkcyBpbiBhIG1lc3NhZ2Ugb3IgYm9keSBwYXJ0Lg0KKyAgICAgKg0KKyAgICAgKiBAdGhyb3dzIE1pbWVFeGNlcHRpb24gb24gcHJvY2Vzc2luZyBlcnJvcnMNCisgICAgICovDQorICAgIHZvaWQgZW5kSGVhZGVyKCkgdGhyb3dzIE1pbWVFeGNlcHRpb247DQorDQorICAgIC8qKg0KKyAgICAgKiBDYWxsZWQgZm9yIHRoZSBwcmVhbWJsZSAod2hhdGV2ZXIgY29tZXMgYmVmb3JlIHRoZSBmaXJzdCBib2R5IHBhcnQpDQorICAgICAqIG9mIGEgPGNvZGU+bXVsdGlwYXJ0Lyo8L2NvZGU+IGVudGl0eS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBpcyB1c2VkIHRvIGdldCB0aGUgY29udGVudHMgb2YgdGhlIHByZWFtYmxlLg0KKyAgICAgKiBAdGhyb3dzIE1pbWVFeGNlcHRpb24gb24gcHJvY2Vzc2luZyBlcnJvcnMNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIG9uIEkvTyBlcnJvcnMuDQorICAgICAqLw0KKyAgICB2b2lkIHByZWFtYmxlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247DQorDQorICAgIC8qKg0KKyAgICAgKiBDYWxsZWQgZm9yIHRoZSBlcGlsb2d1ZSAod2hhdGV2ZXIgY29tZXMgYWZ0ZXIgdGhlIGZpbmFsIGJvZHkgcGFydCkgDQorICAgICAqIG9mIGEgPGNvZGU+bXVsdGlwYXJ0Lyo8L2NvZGU+IGVudGl0eS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBpcyB1c2VkIHRvIGdldCB0aGUgY29udGVudHMgb2YgdGhlIGVwaWxvZ3VlLg0KKyAgICAgKiBAdGhyb3dzIE1pbWVFeGNlcHRpb24gb24gcHJvY2Vzc2luZyBlcnJvcnMNCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIG9uIEkvTyBlcnJvcnMuDQorICAgICAqLw0KKyAgICB2b2lkIGVwaWxvZ3VlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgTWltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb247DQorDQorICAgIC8qKg0KKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYm9keSBvZiBhIG11bHRpcGFydCBlbnRpdHkgaXMgYWJvdXQgdG8gYmUgcGFyc2VkLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGJkIGVuY2Fwc3VsYXRlcyB0aGUgdmFsdWVzIChlaXRoZXIgcmVhZCBmcm9tIHRoZSANCisgICAgICogICAgICAgIG1lc3NhZ2Ugc3RyZWFtIG9yLCBpZiBub3QgcHJlc2VudCwgZGV0ZXJtaW5lZCBpbXBsaWN0bHkgDQorICAgICAqICAgICAgICBhcyBkZXNjcmliZWQgaW4gdGhlIA0KKyAgICAgKiAgICAgICAgTUlNRSByZmM6cykgb2YgdGhlIDxjb2RlPkNvbnRlbnQtVHlwZTwvY29kZT4gYW5kIA0KKyAgICAgKiAgICAgICAgPGNvZGU+Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZzwvY29kZT4gaGVhZGVyIGZpZWxkcy4NCisgICAgICogQHRocm93cyBNaW1lRXhjZXB0aW9uIG9uIHByb2Nlc3NpbmcgZXJyb3JzDQorICAgICAqLw0KKyAgICB2b2lkIHN0YXJ0TXVsdGlwYXJ0KEJvZHlEZXNjcmlwdG9yIGJkKSB0aHJvd3MgTWltZUV4Y2VwdGlvbjsNCisNCisgICAgLyoqDQorICAgICAqIENhbGxlZCB3aGVuIHRoZSBib2R5IG9mIGFuIGVudGl0eSBoYXMgYmVlbiBwYXJzZWQuDQorICAgICAqDQorICAgICAqIEB0aHJvd3MgTWltZUV4Y2VwdGlvbiBvbiBwcm9jZXNzaW5nIGVycm9ycw0KKyAgICAgKi8NCisgICAgdm9pZCBlbmRNdWx0aXBhcnQoKSB0aHJvd3MgTWltZUV4Y2VwdGlvbjsNCisNCisgICAgLyoqDQorICAgICAqIENhbGxlZCB3aGVuIHRoZSBib2R5IG9mIGEgZGlzY3JldGUgKG5vbi1tdWx0aXBhcnQpIGVudGl0eSBpcyBhYm91dCB0byANCisgICAgICogYmUgcGFyc2VkLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGJkIHNlZSB7QGxpbmsgI3N0YXJ0TXVsdGlwYXJ0KEJvZHlEZXNjcmlwdG9yKX0NCisgICAgICogQHBhcmFtIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgYm9keS4gTk9URTogdGhpcyBpcyB0aGUgcmF3IGJvZHkgY29udGVudHMgDQorICAgICAqICAgICAgICAgICAtIGl0IHdpbGwgbm90IGJlIGRlY29kZWQgaWYgZW5jb2RlZC4gVGhlIDxjb2RlPmJkPC9jb2RlPg0KKyAgICAgKiAgICAgICAgICAgcGFyYW1ldGVyIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSBob3cgdGhlIHN0cmVhbSBkYXRhDQorICAgICAqICAgICAgICAgICBzaG91bGQgYmUgZGVjb2RlZC4NCisgICAgICogQHRocm93cyBNaW1lRXhjZXB0aW9uIG9uIHByb2Nlc3NpbmcgZXJyb3JzDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBvbiBJL08gZXJyb3JzLg0KKyAgICAgKi8NCisgICAgdm9pZCBib2R5KEJvZHlEZXNjcmlwdG9yIGJkLCBJbnB1dFN0cmVhbSBpcykNCisgICAgICAgIHRocm93cyBNaW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsNCisNCisgICAgLyoqDQorICAgICAqIENhbGxlZCB3aGVuIGEgbmV3IGVudGl0eSAobWVzc2FnZSBvciBib2R5IHBhcnQpIHN0YXJ0cyBhbmQgdGhlIA0KKyAgICAgKiBwYXJzZXIgaXMgaW4gPGNvZGU+cmF3PC9jb2RlPiBtb2RlLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGlzIHRoZSByYXcgY29udGVudHMgb2YgdGhlIGVudGl0eS4NCisgICAgICogQHRocm93cyBNaW1lRXhjZXB0aW9uIG9uIHByb2Nlc3NpbmcgZXJyb3JzDQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBvbiBJL08gZXJyb3JzLg0KKyAgICAgKiBAc2VlIE1pbWVTdHJlYW1QYXJzZXIjc2V0UmF3KGJvb2xlYW4pDQorICAgICAqLw0KKyAgICB2b2lkIHJhdyhJbnB1dFN0cmVhbSBpcykgdGhyb3dzIE1pbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uOw0KKw0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9FbnRpdHlTdGF0ZU1hY2hpbmUuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL0VudGl0eVN0YXRlTWFjaGluZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOTNhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9FbnRpdHlTdGF0ZU1hY2hpbmUuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkJvZHlEZXNjcmlwdG9yOw0KKw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KKw0KKy8qKg0KKyAqIFJlcHJlc2VudHMgdGhlIGludGVyYWwgc3RhdGUgb2YgYSBNSU1FIGVudGl0eSwgd2hpY2ggaXMgYmVpbmcgcmV0cmlldmVkIA0KKyAqIGZyb20gYW4gaW5wdXQgc3RyZWFtIGJ5IGEgTUlNRSBwYXJzZXIuDQorICovDQorcHVibGljIGludGVyZmFjZSBFbnRpdHlTdGF0ZU1hY2hpbmUgew0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBlbnRpdHkuDQorICAgICAqIA0KKyAgICAgKiBAc2VlIEVudGl0eVN0YXRlcw0KKyAgICAgKiANCisgICAgICogQHJldHVybiBjdXJyZW50IHN0YXRlDQorICAgICAqLw0KKyAgICBpbnQgZ2V0U3RhdGUoKTsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBTZXRzIHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBtb2RlLg0KKyAgICAgKiBUaGUgcmVjdXJzaW9uIG1vZGUgc3BlY2lmaWVzIHRoZSBhcHByb2FjaCB0YWtlbiB0byBwYXJzaW5nIHBhcnRzLg0KKyAgICAgKiB7QGxpbmsgUmVjdXJzaW9uTW9kZSNNX1JBV30gbW9kZSBkb2VzIG5vdCBwYXJzZSB0aGUgcGFydCBhdCBhbGwuDQorICAgICAqIHtAbGluayBSZWN1cnNpb25Nb2RlI01fUkVDVVJTRX0gbW9kZSByZWN1cnNpdmVseSBwYXJzZXMgZWFjaCBtYWlsDQorICAgICAqIHdoZW4gYW4gPGNvZGU+bWVzc2FnZS9yZmM4MjI8L2NvZGU+IHBhcnQgaXMgZW5jb3VudGVkOw0KKyAgICAgKiB7QGxpbmsgUmVjdXJzaW9uTW9kZSNNX05PX1JFQ1VSU0V9IGRvZXMgbm90Lg0KKyAgICAgKiANCisgICAgICogQHNlZSBSZWN1cnNpb25Nb2RlDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcmVjdXJzaW9uTW9kZQ0KKyAgICAgKi8NCisgICAgdm9pZCBzZXRSZWN1cnNpb25Nb2RlKGludCByZWN1cnNpb25Nb2RlKTsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBBZHZhbmNlcyB0aGUgc3RhdGUgbWFjaGluZSB0byB0aGUgbmV4dCBzdGF0ZSBpbiB0aGUgDQorICAgICAqIHByb2Nlc3Mgb2YgdGhlIE1JTUUgc3RyZWFtIHBhcnNpbmcuIFRoaXMgbWV0aG9kIA0KKyAgICAgKiBtYXkgcmV0dXJuIGFuIG5ldyBzdGF0ZSBtYWNoaW5lIHRoYXQgcmVwcmVzZW50cyBhbiBlbWJlZGRlZCANCisgICAgICogZW50aXR5LCB3aGljaCBtdXN0IGJlIHBhcnNlZCBiZWZvcmUgdGhlIHBhcnNpbmcgcHJvY2VzcyBvZiANCisgICAgICogdGhlIGN1cnJlbnQgZW50aXR5IGNhbiBwcm9jZWVkLg0KKyAgICAgKiANCisgICAgICogQHJldHVybiBhIHN0YXRlIG1hY2hpbmUgb2YgYW4gZW1iZWRkZWQgZW50aXR5LCBpZiBlbmNvdW50ZXJlZCwgDQorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4NCisgICAgICogIA0KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuDQorICAgICAqIEB0aHJvd3MgTWltZUV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBjYW4gbm90IGJlIHByb2Nlc3NlZCBkdWUgDQorICAgICAqICB0byB0aGUgTUlNRSBzcGVjaWZpY2F0aW9uIHZpb2xhdGlvbi4NCisgICAgICovDQorICAgIEVudGl0eVN0YXRlTWFjaGluZSBhZHZhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNaW1lRXhjZXB0aW9uOw0KKyAgICANCisgICAgLyoqDQorICAgICAqIFJldHVybnMgZGVzY3JpcHRpb24gb2YgdGhlIGVudGl0eSBib2R5Lg0KKyAgICAgKiANCisgICAgICogQHJldHVybiBib2R5IGRlc2NyaXB0aW9uDQorICAgICAqIA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgYm9keSBkZXNjcmlwdGlvbiBjYW5ub3QgYmUNCisgICAgICogIG9idGFpbmVkIGF0IHRoZSBjdXJyZW50IHN0YWdlIG9mIHRoZSBwYXJzaW5nIHByb2Nlc3MuIA0KKyAgICAgKi8NCisgICAgQm9keURlc2NyaXB0b3IgZ2V0Qm9keURlc2NyaXB0b3IoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOw0KKyAgICANCisgICAgLyoqDQorICAgICAqIFJldHVybnMgY29udGVudCBzdHJlYW0gb2YgdGhlIGVudGl0eSBib2R5Lg0KKyAgICAgKiANCisgICAgICogQHJldHVybiBpbnB1dCBzdHJlYW0NCisgICAgICogDQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBjb250ZW50IHN0cmVhbSBjYW5ub3QgYmUNCisgICAgICogIG9idGFpbmVkIGF0IHRoZSBjdXJyZW50IHN0YWdlIG9mIHRoZSBwYXJzaW5nIHByb2Nlc3MuIA0KKyAgICAgKi8NCisgICAgSW5wdXRTdHJlYW0gZ2V0Q29udGVudFN0cmVhbSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247DQorIA0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBjdXJyZW50IGhlYWRlciBmaWVsZC4NCisgICAgICogDQorICAgICAqIEByZXR1cm4gaGVhZGVyIGZpZWxkDQorICAgICAqIA0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIGhlYWRlciBmaWVsZCBjYW5ub3QgYmUNCisgICAgICogIG9idGFpbmVkIGF0IHRoZSBjdXJyZW50IHN0YWdlIG9mIHRoZSBwYXJzaW5nIHByb2Nlc3MuIA0KKyAgICAgKi8NCisgICAgRmllbGQgZ2V0RmllbGQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOw0KKyAgICANCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvRW50aXR5U3RhdGVzLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9FbnRpdHlTdGF0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njg2MzMyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvRW50aXR5U3RhdGVzLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOw0KKw0KKy8qKg0KKyAqIEVudW1lcmF0aW9uIG9mIHN0YXRlcyBhbiBlbnRpdHkgaXMgZXhwZWN0ZWQgdG8gZ28gdGhyb3VnaA0KKyAqIGluIHRoZSBwcm9jZXNzIG9mIHRoZSBNSU1FIHN0cmVhbSBwYXJzaW5nLg0KKyAqLw0KK3B1YmxpYyBpbnRlcmZhY2UgRW50aXR5U3RhdGVzIHsNCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgdG9rZW4gaW5kaWNhdGVzLCB0aGF0IHRoZSBNSU1FIHN0cmVhbSBoYXMgYmVlbiBjb21wbGV0ZWx5DQorICAgICAqIGFuZCBzdWNjZXNzZnVsbHkgcGFyc2VkLCBhbmQgbm8gbW9yZSBkYXRhIGlzIGF2YWlsYWJsZS4NCisgICAgICovDQorICAgIGludCBUX0VORF9PRl9TVFJFQU0gPSAtMTsNCisgICAgLyoqDQorICAgICAqIFRoaXMgdG9rZW4gaW5kaWNhdGVzLCB0aGF0IHRoZSBNSU1FIHN0cmVhbSBpcyBjdXJyZW50bHkNCisgICAgICogYXQgdGhlIGJlZ2lubmluZyBvZiBhIG1lc3NhZ2UuDQorICAgICAqLw0KKyAgICBpbnQgVF9TVEFSVF9NRVNTQUdFID0gMDsNCisgICAgLyoqDQorICAgICAqIFRoaXMgdG9rZW4gaW5kaWNhdGVzLCB0aGF0IHRoZSBNSU1FIHN0cmVhbSBpcyBjdXJyZW50bHkNCisgICAgICogYXQgdGhlIGVuZCBvZiBhIG1lc3NhZ2UuDQorICAgICAqLw0KKyAgICBpbnQgVF9FTkRfTUVTU0FHRSA9IDE7DQorICAgIC8qKg0KKyAgICAgKiBUaGlzIHRva2VuIGluZGljYXRlcywgdGhhdCBhIHJhdyBlbnRpdHkgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4NCisgICAgICovDQorICAgIGludCBUX1JBV19FTlRJVFkgPSAyOw0KKyAgICAvKioNCisgICAgICogVGhpcyB0b2tlbiBpbmRpY2F0ZXMsIHRoYXQgYSBtZXNzYWdlIHBhcnRzIGhlYWRlcnMgYXJlIG5vdw0KKyAgICAgKiBiZWluZyBwYXJzZWQuDQorICAgICAqLw0KKyAgICBpbnQgVF9TVEFSVF9IRUFERVIgPSAzOw0KKyAgICAvKioNCisgICAgICogVGhpcyB0b2tlbiBpbmRpY2F0ZXMsIHRoYXQgYSBtZXNzYWdlIHBhcnRzIGZpZWxkIGhhcyBub3cNCisgICAgICogYmVlbiBwYXJzZWQuIA0KKyAgICAgKi8NCisgICAgaW50IFRfRklFTEQgPSA0Ow0KKyAgICAvKioNCisgICAgICogVGhpcyB0b2tlbiBpbmRpY2F0ZXMsIHRoYXQgcGFydCBoZWFkZXJzIGhhdmUgbm93IGJlZW4NCisgICAgICogcGFyc2VkLg0KKyAgICAgKi8NCisgICAgaW50IFRfRU5EX0hFQURFUiA9IDU7DQorICAgIC8qKg0KKyAgICAgKiBUaGlzIHRva2VuIGluZGljYXRlcywgdGhhdCBhIG11bHRpcGFydCBib2R5IGlzIGJlaW5nIHBhcnNlZC4NCisgICAgICovDQorICAgIGludCBUX1NUQVJUX01VTFRJUEFSVCA9IDY7DQorICAgIC8qKg0KKyAgICAgKiBUaGlzIHRva2VuIGluZGljYXRlcywgdGhhdCBhIG11bHRpcGFydCBib2R5IGhhcyBiZWVuIHBhcnNlZC4NCisgICAgICovDQorICAgIGludCBUX0VORF9NVUxUSVBBUlQgPSA3Ow0KKyAgICAvKioNCisgICAgICogVGhpcyB0b2tlbiBpbmRpY2F0ZXMsIHRoYXQgYSBtdWx0aXBhcnRzIHByZWFtYmxlIGlzIGJlaW5nDQorICAgICAqIHBhcnNlZC4gDQorICAgICAqLw0KKyAgICBpbnQgVF9QUkVBTUJMRSA9IDg7DQorICAgIC8qKg0KKyAgICAgKiBUaGlzIHRva2VuIGluZGljYXRlcywgdGhhdCBhIG11bHRpcGFydHMgZXBpbG9ndWUgaXMgYmVpbmcNCisgICAgICogcGFyc2VkLiANCisgICAgICovDQorICAgIGludCBUX0VQSUxPR1VFID0gOTsNCisgICAgLyoqDQorICAgICAqIFRoaXMgdG9rZW4gaW5kaWNhdGVzLCB0aGF0IHRoZSBNSU1FIHN0cmVhbSBpcyBjdXJyZW50bHkNCisgICAgICogYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJvZHkgcGFydC4NCisgICAgICovDQorICAgIGludCBUX1NUQVJUX0JPRFlQQVJUID0gMTA7DQorICAgIC8qKg0KKyAgICAgKiBUaGlzIHRva2VuIGluZGljYXRlcywgdGhhdCB0aGUgTUlNRSBzdHJlYW0gaXMgY3VycmVudGx5DQorICAgICAqIGF0IHRoZSBlbmQgb2YgYSBib2R5IHBhcnQuDQorICAgICAqLw0KKyAgICBpbnQgVF9FTkRfQk9EWVBBUlQgPSAxMTsNCisgICAgLyoqDQorICAgICAqIFRoaXMgdG9rZW4gaW5kaWNhdGVzLCB0aGF0IGFuIGF0b21pYyBlbnRpdHkgaXMgYmVpbmcgcGFyc2VkLg0KKyAgICAgKi8NCisgICAgaW50IFRfQk9EWSA9IDEyOw0KKw0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9FdmVudC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDI3Y2ZhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvRXZlbnQuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7DQorDQorLyoqDQorICogRW51bWVyYXRlcyBldmVudHMgd2hpY2ggY2FuIGJlIG1vbml0b3JlZC4NCisgKi8NCitwdWJsaWMgZmluYWwgY2xhc3MgRXZlbnQgeyANCisNCisgICAgLyoqIEluZGljYXRlcyB0aGF0IGEgYm9keSBwYXJ0IGVuZGVkIHByZW1hdHVyZWx5LiAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV2ZW50IE1JTUVfQk9EWV9QUkVNQVRVUkVfRU5EIA0KKyAgICAgICAgPSBuZXcgRXZlbnQoIkJvZHkgcGFydCBlbmRlZCBwcmVtYXR1cmVseS4gIiArDQorICAgICAgICAgICAgICAgICJCb3VuZGFyeSBkZXRlY3RlZCBpbiBoZWFkZXIgb3IgRU9GIHJlYWNoZWQuIik7IA0KKyAgICAvKiogSW5kaWNhdGVzIHRoYXQgdW5leHBlY3RlZCBlbmQgb2YgaGVhZGVycyBkZXRlY3RlZC4qLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV2ZW50IEhFQURFUlNfUFJFTUFUVVJFX0VORCANCisgICAgICAgID0gbmV3IEV2ZW50KCJVbmV4cGVjdGVkIGVuZCBvZiBoZWFkZXJzIGRldGVjdGVkLiAiICsNCisgICAgICAgICAgICAgICAgIkhpZ2hlciBsZXZlbCBib3VuZGFyeSBkZXRlY3RlZCBvciBFT0YgcmVhY2hlZC4iKTsNCisgICAgLyoqIEluZGljYXRlcyB0aGF0IHVuZXhwZWN0ZWQgZW5kIG9mIGhlYWRlcnMgZGV0ZWN0ZWQuKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFdmVudCBJTkFMSURfSEVBREVSIA0KKyAgICAgICAgPSBuZXcgRXZlbnQoIkludmFsaWQgaGVhZGVyIGVuY291bnRlcmVkIik7DQorICAgIA0KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb2RlOw0KKyAgICANCisgICAgcHVibGljIEV2ZW50KGZpbmFsIFN0cmluZyBjb2RlKSB7DQorICAgICAgICBzdXBlcigpOw0KKyAgICAgICAgaWYgKGNvZGUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvZGUgbWF5IG5vdCBiZSBudWxsIik7DQorICAgICAgICB9DQorICAgICAgICB0aGlzLmNvZGUgPSBjb2RlOw0KKyAgICB9DQorICAgIA0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsNCisgICAgICAgIHJldHVybiBjb2RlLmhhc2hDb2RlKCk7DQorICAgIH0NCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQorICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsNCisgICAgICAgIGlmICh0aGlzID09IG9iaikgcmV0dXJuIHRydWU7DQorICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRXZlbnQpIHsNCisgICAgICAgICAgICBFdmVudCB0aGF0ID0gKEV2ZW50KSBvYmo7DQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29kZS5lcXVhbHModGhhdC5jb2RlKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KKyAgICBAT3ZlcnJpZGUNCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCisgICAgICAgIHJldHVybiBjb2RlOw0KKyAgICB9DQorICAgIA0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9GaWVsZC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvRmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWM2OThiCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvRmllbGQuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOworCisvKioKKyAqIEFic3RyYWN0IE1JTUUgZmllbGQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmllbGQgeworICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkICg8Y29kZT5TdWJqZWN0PC9jb2RlPiwgPGNvZGU+RnJvbTwvY29kZT4sIGV0YykuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgZmllbGQgbmFtZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdW5wYXJzZWQgYW5kIHBvc3NpYmx5IGVuY29kZWQgKHNlZSBSRkMgMjA0NykgZmllbGQgYm9keSBzdHJpbmcuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgdW5wYXJzZWQgZmllbGQgYm9keSBzdHJpbmcuCisgICAgICovCisgICAgU3RyaW5nIGdldEJvZHkoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG9yaWdpbmFsIHJhdyBmaWVsZCBieXRlcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCByYXcgZmllbGQgYnl0ZXMuCisgICAgICovCisgICAgQnl0ZVNlcXVlbmNlIGdldFJhdygpOworICAgIAorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZUVudGl0eS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZUVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYThiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lRW50aXR5LmphdmEKQEAgLTAsMCArMSwzMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5CYXNlNjRJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5RdW90ZWRQcmludGFibGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkJvZHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvLkJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvLkxpbWl0ZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5MaW5lTnVtYmVyU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvLkxpbmVSZWFkZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5MaW5lUmVhZGVySW5wdXRTdHJlYW1BZGFwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvLk1pbWVCb3VuZGFyeUlucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ29udGVudFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5NaW1lVXRpbDsKKworcHVibGljIGNsYXNzIE1pbWVFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eSB7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBzdGF0ZSwgbm90IGV4cG9zZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfSU5fQk9EWVBBUlQgPSAtMjsKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBzdGF0ZSwgbm90IGV4cG9zZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfSU5fTUVTU0FHRSA9IC0zOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaW5lTnVtYmVyU291cmNlIGxpbmVTb3VyY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBpbmJ1ZmZlcjsKKyAgICAKKyAgICBwcml2YXRlIGludCByZWN1cnNpb25Nb2RlOworICAgIHByaXZhdGUgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0gbWltZVN0cmVhbTsKKyAgICBwcml2YXRlIExpbmVSZWFkZXJJbnB1dFN0cmVhbUFkYXB0b3IgZGF0YVN0cmVhbTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcEhlYWRlcjsKKyAgICAKKyAgICBwcml2YXRlIGJ5dGVbXSB0bXBidWY7CisgICAgCisgICAgcHVibGljIE1pbWVFbnRpdHkoCisgICAgICAgICAgICBMaW5lTnVtYmVyU291cmNlIGxpbmVTb3VyY2UsCisgICAgICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBpbmJ1ZmZlciwKKyAgICAgICAgICAgIEJvZHlEZXNjcmlwdG9yIHBhcmVudCwgCisgICAgICAgICAgICBpbnQgc3RhcnRTdGF0ZSwgCisgICAgICAgICAgICBpbnQgZW5kU3RhdGUsCisgICAgICAgICAgICBNaW1lRW50aXR5Q29uZmlnIGNvbmZpZykgeworICAgICAgICBzdXBlcihwYXJlbnQsIHN0YXJ0U3RhdGUsIGVuZFN0YXRlLCBjb25maWcpOworICAgICAgICB0aGlzLmxpbmVTb3VyY2UgPSBsaW5lU291cmNlOworICAgICAgICB0aGlzLmluYnVmZmVyID0gaW5idWZmZXI7CisgICAgICAgIHRoaXMuZGF0YVN0cmVhbSA9IG5ldyBMaW5lUmVhZGVySW5wdXRTdHJlYW1BZGFwdG9yKAorICAgICAgICAgICAgICAgIGluYnVmZmVyLAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRNYXhMaW5lTGVuKCkpOworICAgICAgICB0aGlzLnNraXBIZWFkZXIgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWltZUVudGl0eSgKKyAgICAgICAgICAgIExpbmVOdW1iZXJTb3VyY2UgbGluZVNvdXJjZSwKKyAgICAgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGluYnVmZmVyLAorICAgICAgICAgICAgQm9keURlc2NyaXB0b3IgcGFyZW50LCAKKyAgICAgICAgICAgIGludCBzdGFydFN0YXRlLCAKKyAgICAgICAgICAgIGludCBlbmRTdGF0ZSkgeworICAgICAgICB0aGlzKGxpbmVTb3VyY2UsIGluYnVmZmVyLCBwYXJlbnQsIHN0YXJ0U3RhdGUsIGVuZFN0YXRlLCAKKyAgICAgICAgICAgICAgICBuZXcgTWltZUVudGl0eUNvbmZpZygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlY3Vyc2lvbk1vZGUoKSB7CisgICAgICAgIHJldHVybiByZWN1cnNpb25Nb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlY3Vyc2lvbk1vZGUoaW50IHJlY3Vyc2lvbk1vZGUpIHsKKyAgICAgICAgdGhpcy5yZWN1cnNpb25Nb2RlID0gcmVjdXJzaW9uTW9kZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBza2lwSGVhZGVyKFN0cmluZyBjb250ZW50VHlwZSkgeworICAgICAgICBpZiAoc3RhdGUgIT0gRW50aXR5U3RhdGVzLlRfU1RBUlRfTUVTU0FHRSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBzdGF0ZTogIiArIHN0YXRlVG9TdHJpbmcoc3RhdGUpKTsKKyAgICAgICAgfQorICAgICAgICBza2lwSGVhZGVyID0gdHJ1ZTsKKyAgICAgICAgQnl0ZVNlcXVlbmNlIHJhdyA9IENvbnRlbnRVdGlsLmVuY29kZSgiQ29udGVudC1UeXBlOiAiICsgY29udGVudFR5cGUpOworICAgICAgICBib2R5LmFkZEZpZWxkKG5ldyBSYXdGaWVsZChyYXcsIDEyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRMaW5lTnVtYmVyKCkgeworICAgICAgICBpZiAobGluZVNvdXJjZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbGluZVNvdXJjZS5nZXRMaW5lTnVtYmVyKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMaW5lUmVhZGVySW5wdXRTdHJlYW0gZ2V0RGF0YVN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGFTdHJlYW07CisgICAgfQorICAgIAorICAgIHB1YmxpYyBFbnRpdHlTdGF0ZU1hY2hpbmUgYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWltZUV4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFOgorICAgICAgICAgICAgaWYgKHNraXBIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IEVudGl0eVN0YXRlcy5UX0VORF9IRUFERVI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXRlID0gRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRW50aXR5U3RhdGVzLlRfU1RBUlRfQk9EWVBBUlQ6CisgICAgICAgICAgICBzdGF0ZSA9IEVudGl0eVN0YXRlcy5UX1NUQVJUX0hFQURFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX1NUQVJUX0hFQURFUjoKKyAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9GSUVMRDoKKyAgICAgICAgICAgIHN0YXRlID0gcGFyc2VGaWVsZCgpID8gRW50aXR5U3RhdGVzLlRfRklFTEQgOiBFbnRpdHlTdGF0ZXMuVF9FTkRfSEVBREVSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRW50aXR5U3RhdGVzLlRfRU5EX0hFQURFUjoKKyAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGJvZHkuZ2V0TWltZVR5cGUoKTsKKyAgICAgICAgICAgIGlmIChyZWN1cnNpb25Nb2RlID09IFJlY3Vyc2lvbk1vZGUuTV9GTEFUKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBFbnRpdHlTdGF0ZXMuVF9CT0RZOworICAgICAgICAgICAgfSBlbHNlIGlmIChNaW1lVXRpbC5pc011bHRpcGFydChtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IEVudGl0eVN0YXRlcy5UX1NUQVJUX01VTFRJUEFSVDsKKyAgICAgICAgICAgICAgICBjbGVhck1pbWVTdHJlYW0oKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmVjdXJzaW9uTW9kZSAhPSBSZWN1cnNpb25Nb2RlLk1fTk9fUkVDVVJTRSAKKyAgICAgICAgICAgICAgICAgICAgJiYgTWltZVV0aWwuaXNNZXNzYWdlKG1pbWVUeXBlKSkgeworICAgICAgICAgICAgICAgIHN0YXRlID0gVF9JTl9NRVNTQUdFOworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0TWVzc2FnZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IEVudGl0eVN0YXRlcy5UX0JPRFk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NVUxUSVBBUlQ6CisgICAgICAgICAgICBpZiAoZGF0YVN0cmVhbS5pc1VzZWQoKSkgeworICAgICAgICAgICAgICAgIGFkdmFuY2VUb0JvdW5kYXJ5KCk7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RhdGUgPSBFbnRpdHlTdGF0ZXMuVF9FTkRfTVVMVElQQVJUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVNaW1lU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBFbnRpdHlTdGF0ZXMuVF9QUkVBTUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX1BSRUFNQkxFOgorICAgICAgICAgICAgYWR2YW5jZVRvQm91bmRhcnkoKTsgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChtaW1lU3RyZWFtLmlzTGFzdFBhcnQoKSkgeworICAgICAgICAgICAgICAgIGNsZWFyTWltZVN0cmVhbSgpOworICAgICAgICAgICAgICAgIHN0YXRlID0gRW50aXR5U3RhdGVzLlRfRU5EX01VTFRJUEFSVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2xlYXJNaW1lU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgY3JlYXRlTWltZVN0cmVhbSgpOworICAgICAgICAgICAgICAgIHN0YXRlID0gVF9JTl9CT0RZUEFSVDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dE1pbWVFbnRpdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRfSU5fQk9EWVBBUlQ6CisgICAgICAgICAgICBhZHZhbmNlVG9Cb3VuZGFyeSgpOworICAgICAgICAgICAgaWYgKG1pbWVTdHJlYW0uZW9mKCkgJiYgIW1pbWVTdHJlYW0uaXNMYXN0UGFydCgpKSB7CisgICAgICAgICAgICAgICAgbW9uaXRvcihFdmVudC5NSU1FX0JPRFlfUFJFTUFUVVJFX0VORCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbWltZVN0cmVhbS5pc0xhc3RQYXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJNaW1lU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1pbWVTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBUX0lOX0JPRFlQQVJUOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dE1pbWVFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGVhck1pbWVTdHJlYW0oKTsKKyAgICAgICAgICAgIHN0YXRlID0gRW50aXR5U3RhdGVzLlRfRVBJTE9HVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFbnRpdHlTdGF0ZXMuVF9FUElMT0dVRToKKyAgICAgICAgICAgIHN0YXRlID0gRW50aXR5U3RhdGVzLlRfRU5EX01VTFRJUEFSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0JPRFk6CisgICAgICAgIGNhc2UgRW50aXR5U3RhdGVzLlRfRU5EX01VTFRJUEFSVDoKKyAgICAgICAgY2FzZSBUX0lOX01FU1NBR0U6CisgICAgICAgICAgICBzdGF0ZSA9IGVuZFN0YXRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gZW5kU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IEVudGl0eVN0YXRlcy5UX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIHN0YXRlOiAiICsgc3RhdGVUb1N0cmluZyhzdGF0ZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjcmVhdGVNaW1lU3RyZWFtKCkgdGhyb3dzIE1pbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGJvdW5kYXJ5ID0gYm9keS5nZXRCb3VuZGFyeSgpOworICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IDIgKiBib3VuZGFyeS5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGJ1ZmZlclNpemUgPCA0MDk2KSB7CisgICAgICAgICAgICBidWZmZXJTaXplID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKG1pbWVTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1pbWVTdHJlYW0gPSBuZXcgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVTdHJlYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmdldE1heExpbmVMZW4oKSksIAorICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmJ1ZmZlci5lbnN1cmVDYXBhY2l0eShidWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICBtaW1lU3RyZWFtID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGluYnVmZmVyLCBib3VuZGFyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0aHJvd24gd2hlbiBib3VuZGFyeSBpcyB0b28gbG9uZworICAgICAgICAgICAgdGhyb3cgbmV3IE1pbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICB9CisgICAgICAgIGRhdGFTdHJlYW0gPSBuZXcgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvcigKKyAgICAgICAgICAgICAgICBtaW1lU3RyZWFtLAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRNYXhMaW5lTGVuKCkpOyAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNsZWFyTWltZVN0cmVhbSgpIHsKKyAgICAgICAgbWltZVN0cmVhbSA9IG51bGw7CisgICAgICAgIGRhdGFTdHJlYW0gPSBuZXcgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvcigKKyAgICAgICAgICAgICAgICBpbmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0TWF4TGluZUxlbigpKTsgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBhZHZhbmNlVG9Cb3VuZGFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghZGF0YVN0cmVhbS5lb2YoKSkgeworICAgICAgICAgICAgaWYgKHRtcGJ1ZiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdG1wYnVmID0gbmV3IGJ5dGVbMjA0OF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IGdldExpbWl0ZWRDb250ZW50U3RyZWFtKCk7CisgICAgICAgICAgICB3aGlsZSAoaW5zdHJlYW0ucmVhZCh0bXBidWYpIT0gLTEpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIEVudGl0eVN0YXRlTWFjaGluZSBuZXh0TWVzc2FnZSgpIHsKKyAgICAgICAgU3RyaW5nIHRyYW5zZmVyRW5jb2RpbmcgPSBib2R5LmdldFRyYW5zZmVyRW5jb2RpbmcoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5zdHJlYW07CisgICAgICAgIGlmIChNaW1lVXRpbC5pc0Jhc2U2NEVuY29kaW5nKHRyYW5zZmVyRW5jb2RpbmcpKSB7CisgICAgICAgICAgICBsb2cuZGVidWcoImJhc2U2NCBlbmNvZGVkIG1lc3NhZ2UvcmZjODIyIGRldGVjdGVkIik7CisgICAgICAgICAgICBpbnN0cmVhbSA9IG5ldyBCYXNlNjRJbnB1dFN0cmVhbShkYXRhU3RyZWFtKTsgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKE1pbWVVdGlsLmlzUXVvdGVkUHJpbnRhYmxlRW5jb2RlZCh0cmFuc2ZlckVuY29kaW5nKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZS9yZmM4MjIgZGV0ZWN0ZWQiKTsKKyAgICAgICAgICAgIGluc3RyZWFtID0gbmV3IFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtKGRhdGFTdHJlYW0pOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnN0cmVhbSA9IGRhdGFTdHJlYW07CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChyZWN1cnNpb25Nb2RlID09IFJlY3Vyc2lvbk1vZGUuTV9SQVcpIHsKKyAgICAgICAgICAgIFJhd0VudGl0eSBtZXNzYWdlID0gbmV3IFJhd0VudGl0eShpbnN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1pbWVFbnRpdHkgbWVzc2FnZSA9IG5ldyBNaW1lRW50aXR5KAorICAgICAgICAgICAgICAgICAgICBsaW5lU291cmNlLCAKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RyZWFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICogMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0TWF4TGluZUxlbigpKSwKKyAgICAgICAgICAgICAgICAgICAgYm9keSwgCisgICAgICAgICAgICAgICAgICAgIEVudGl0eVN0YXRlcy5UX1NUQVJUX01FU1NBR0UsIAorICAgICAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9FTkRfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnKTsKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0UmVjdXJzaW9uTW9kZShyZWN1cnNpb25Nb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgRW50aXR5U3RhdGVNYWNoaW5lIG5leHRNaW1lRW50aXR5KCkgeworICAgICAgICBpZiAocmVjdXJzaW9uTW9kZSA9PSBSZWN1cnNpb25Nb2RlLk1fUkFXKSB7CisgICAgICAgICAgICBSYXdFbnRpdHkgbWVzc2FnZSA9IG5ldyBSYXdFbnRpdHkobWltZVN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgbWltZVN0cmVhbSwgCisgICAgICAgICAgICAgICAgICAgIDQgKiAxMDI0LAorICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0TWF4TGluZUxlbigpKTsKKyAgICAgICAgICAgIE1pbWVFbnRpdHkgbWltZWVudGl0eSA9IG5ldyBNaW1lRW50aXR5KAorICAgICAgICAgICAgICAgICAgICBsaW5lU291cmNlLCAKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICBib2R5LCAKKyAgICAgICAgICAgICAgICAgICAgRW50aXR5U3RhdGVzLlRfU1RBUlRfQk9EWVBBUlQsIAorICAgICAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9FTkRfQk9EWVBBUlQsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZyk7CisgICAgICAgICAgICBtaW1lZW50aXR5LnNldFJlY3Vyc2lvbk1vZGUocmVjdXJzaW9uTW9kZSk7CisgICAgICAgICAgICByZXR1cm4gbWltZWVudGl0eTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldExpbWl0ZWRDb250ZW50U3RyZWFtKCkgeworICAgICAgICBsb25nIG1heENvbnRlbnRMaW1pdCA9IGNvbmZpZy5nZXRNYXhDb250ZW50TGVuKCk7CisgICAgICAgIGlmIChtYXhDb250ZW50TGltaXQgPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oZGF0YVN0cmVhbSwgbWF4Q29udGVudExpbWl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhU3RyZWFtOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKCkgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgRW50aXR5U3RhdGVzLlRfU1RBUlRfTVVMVElQQVJUOgorICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX1BSRUFNQkxFOgorICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0VQSUxPR1VFOgorICAgICAgICBjYXNlIEVudGl0eVN0YXRlcy5UX0JPRFk6CisgICAgICAgICAgICByZXR1cm4gZ2V0TGltaXRlZENvbnRlbnRTdHJlYW0oKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgc3RhdGU6ICIgKyBzdGF0ZVRvU3RyaW5nKHN0YXRlKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVFbnRpdHlDb25maWcuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVFbnRpdHlDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTk1YWY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZUVudGl0eUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVFeGNlcHRpb247CisKKy8qKgorICogTUlNRSBlbnRpdHkgY29uZmlndXJhdGlvbgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWltZUVudGl0eUNvbmZpZyBpbXBsZW1lbnRzIENsb25lYWJsZSB7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbWF4aW1hbEJvZHlEZXNjcmlwdG9yOworICAgIHByaXZhdGUgYm9vbGVhbiBzdHJpY3RQYXJzaW5nOworICAgIHByaXZhdGUgaW50IG1heExpbmVMZW47CisgICAgcHJpdmF0ZSBpbnQgbWF4SGVhZGVyQ291bnQ7CisgICAgcHJpdmF0ZSBsb25nIG1heENvbnRlbnRMZW47CisgICAgcHJpdmF0ZSBib29sZWFuIGNvdW50TGluZU51bWJlcnM7CisgICAgCisgICAgcHVibGljIE1pbWVFbnRpdHlDb25maWcoKSB7CisgICAgICAgIHRoaXMubWF4aW1hbEJvZHlEZXNjcmlwdG9yID0gZmFsc2U7CisgICAgICAgIHRoaXMuc3RyaWN0UGFyc2luZyA9IGZhbHNlOworICAgICAgICB0aGlzLm1heExpbmVMZW4gPSAxMDAwOworICAgICAgICB0aGlzLm1heEhlYWRlckNvdW50ID0gMTAwMDsKKyAgICAgICAgdGhpcy5tYXhDb250ZW50TGVuID0gLTE7CisgICAgICAgIHRoaXMuY291bnRMaW5lTnVtYmVycyA9IGZhbHNlOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01heGltYWxCb2R5RGVzY3JpcHRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWF4aW1hbEJvZHlEZXNjcmlwdG9yOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhpbWFsQm9keURlc2NyaXB0b3IoYm9vbGVhbiBtYXhpbWFsQm9keURlc2NyaXB0b3IpIHsKKyAgICAgICAgdGhpcy5tYXhpbWFsQm9keURlc2NyaXB0b3IgPSBtYXhpbWFsQm9keURlc2NyaXB0b3I7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIERlZmluZXMgd2hldGhlciBtaW5vciB2aW9sYXRpb25zIG9mIHRoZSBNSU1FIHNwZWNpZmljYXRpb24gc2hvdWxkIGJlIAorICAgICAqIHRvbGVyYXRlZCBvciBzaG91bGQgcmVzdWx0IGluIGEge0BsaW5rIE1pbWVFeGNlcHRpb259LiBJZiB0aGlzIHBhcmFtZXRlcgorICAgICAqIGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgYSBzdHJpY3QgaW50ZXJwcmV0YXRpb24gb2YgdGhlIE1JTUUgCisgICAgICogc3BlY2lmaWNhdGlvbiB3aWxsIGJlIGVuZm9yY2VkLCBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogbWlub3IgdmlvbGF0aW9ucyB3aWxsIHJlc3VsdCBpbiBhIHdhcm5pbmcgaW4gdGhlIGxvZy4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gc3RyaWN0UGFyc2luZyB2YWx1ZSBvZiB0aGUgc3RyaWN0IHBhcnNpbmcgbW9kZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmljdFBhcnNpbmcoYm9vbGVhbiBzdHJpY3RQYXJzaW5nKSB7CisgICAgICAgIHRoaXMuc3RyaWN0UGFyc2luZyA9IHN0cmljdFBhcnNpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHN0cmljdCBwYXJzaW5nIG1vZGUKKyAgICAgKiBAc2VlICNzZXRTdHJpY3RQYXJzaW5nKGJvb2xlYW4pCisgICAgICogCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgc3RyaWN0IHBhcnNpbmcgbW9kZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3RyaWN0UGFyc2luZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc3RyaWN0UGFyc2luZzsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aCBsaW1pdC4gUGFyc2luZyBvZiBhIE1JTUUgZW50aXR5IHdpbGwgYmUgdGVybWluYXRlZCAKKyAgICAgKiB3aXRoIGEge0BsaW5rIE1pbWVFeGNlcHRpb259IGlmIGEgbGluZSBpcyBlbmNvdW50ZXJlZCB0aGF0IGV4Y2VlZHMgdGhlIG1heGltdW0KKyAgICAgKiBsZW5ndGggbGltaXQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byBhIG5vbiBwb3NpdGl2ZSB2YWx1ZSB0aGUgbGluZSBsZW5ndGgKKyAgICAgKiBjaGVjayB3aWxsIGJlIGRpc2FibGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtYXhMaW5lTGVuIG1heGltdW0gbGluZSBsZW5ndGggbGltaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXhMaW5lTGVuKGludCBtYXhMaW5lTGVuKSB7CisgICAgICAgIHRoaXMubWF4TGluZUxlbiA9IG1heExpbmVMZW47CisgICAgfQorICAgIAorICAgIC8qKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGxpbWl0CisgICAgICogQHNlZSAjc2V0TWF4TGluZUxlbihpbnQpCisgICAgICogCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgdGhlIG1heGltdW0gbGluZSBsZW5ndGggbGltaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heExpbmVMZW4oKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1heExpbmVMZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbWF4aW11bSBoZWFkZXIgbGltaXQuIFBhcnNpbmcgb2YgYSBNSU1FIGVudGl0eSB3aWxsIGJlIHRlcm1pbmF0ZWQgCisgICAgICogd2l0aCBhIHtAbGluayBNaW1lRXhjZXB0aW9ufSBpZiB0aGUgbnVtYmVyIG9mIGhlYWRlcnMgZXhjZWVkcyB0aGUgbWF4aW11bQorICAgICAqIGxpbWl0LiBJZiB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gYSBub24gcG9zaXRpdmUgdmFsdWUgdGhlIGhlYWRlciBsaW1pdCBjaGVjayAKKyAgICAgKiB3aWxsIGJlIGRpc2FibGVkLgorICAgICAqIAorICAgICAqIEBwYXJhbSBtYXhIZWFkZXJDb3VudCBtYXhpbXVtIGhlYWRlciBsaW1pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heEhlYWRlckNvdW50KGludCBtYXhIZWFkZXJDb3VudCkgeworICAgICAgICB0aGlzLm1heEhlYWRlckNvdW50ID0gbWF4SGVhZGVyQ291bnQ7CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gaGVhZGVyIGxpbWl0CisgICAgICogQHNlZSAjc2V0TWF4SGVhZGVyQ291bnQoaW50KQorICAgICAqIAorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIHRoZSBtYXhpbXVtIGhlYWRlciBsaW1pdAorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4SGVhZGVyQ291bnQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm1heEhlYWRlckNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG1heGltdW0gY29udGVudCBsZW5ndGggbGltaXQuIFBhcnNpbmcgb2YgYSBNSU1FIGVudGl0eSB3aWxsIGJlIHRlcm1pbmF0ZWQgCisgICAgICogd2l0aCBhIHtAbGluayBNaW1lRXhjZXB0aW9ufSBpZiBhIGNvbnRlbnQgYm9keSBleGNlZWRzIHRoZSBtYXhpbXVtIGxlbmd0aCBsaW1pdC4gCisgICAgICogSWYgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgbm9uIHBvc2l0aXZlIHZhbHVlIHRoZSBjb250ZW50IGxlbmd0aAorICAgICAqIGNoZWNrIHdpbGwgYmUgZGlzYWJsZWQuCisgICAgICogCisgICAgICogQHBhcmFtIG1heENvbnRlbnRMZW4gbWF4aW11bSBjb250ZW50IGxlbmd0aCBsaW1pdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1heENvbnRlbnRMZW4obG9uZyBtYXhDb250ZW50TGVuKSB7CisgICAgICAgIHRoaXMubWF4Q29udGVudExlbiA9IG1heENvbnRlbnRMZW47CisgICAgfQorCisgICAgLyoqIAorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gY29udGVudCBsZW5ndGggbGltaXQKKyAgICAgKiBAc2VlICNzZXRNYXhDb250ZW50TGVuKGxvbmcpCisgICAgICogCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgdGhlIG1heGltdW0gY29udGVudCBsZW5ndGggbGltaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhDb250ZW50TGVuKCkgeworICAgICAgICByZXR1cm4gbWF4Q29udGVudExlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIHBhcnNlciBzaG91bGQgY291bnQgbGluZSBudW1iZXJzLiBJZiBlbmFibGVkIGxpbmUKKyAgICAgKiBudW1iZXJzIGFyZSBpbmNsdWRlZCBpbiB0aGUgZGVidWcgb3V0cHV0LgorICAgICAqIAorICAgICAqIEBwYXJhbSBjb3VudExpbmVOdW1iZXJzCisgICAgICogICAgICAgICAgICB2YWx1ZSBvZiB0aGUgbGluZSBudW1iZXIgY291bnRpbmcgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb3VudExpbmVOdW1iZXJzKGJvb2xlYW4gY291bnRMaW5lTnVtYmVycykgeworICAgICAgICB0aGlzLmNvdW50TGluZU51bWJlcnMgPSBjb3VudExpbmVOdW1iZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBsaW5lIG51bWJlciBjb3VudGluZyBtb2RlLgorICAgICAqIAorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIGxpbmUgbnVtYmVyIGNvdW50aW5nIG1vZGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb3VudExpbmVOdW1iZXJzKCkgeworICAgICAgICByZXR1cm4gY291bnRMaW5lTnVtYmVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWltZUVudGl0eUNvbmZpZyBjbG9uZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoTWltZUVudGl0eUNvbmZpZykgc3VwZXIuY2xvbmUoKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuLCBzaW5jZSB3ZSBhcmUgQ2xvbmVhYmxlCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiW21heCBib2R5IGRlc2NyaXB0b3I6ICIgKyBtYXhpbWFsQm9keURlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICArICIsIHN0cmljdCBwYXJzaW5nOiAiICsgc3RyaWN0UGFyc2luZyArICIsIG1heCBsaW5lIGxlbmd0aDogIgorICAgICAgICAgICAgICAgICsgbWF4TGluZUxlbiArICIsIG1heCBoZWFkZXIgY291bnQ6ICIgKyBtYXhIZWFkZXJDb3VudAorICAgICAgICAgICAgICAgICsgIiwgbWF4IGNvbnRlbnQgbGVuZ3RoOiAiICsgbWF4Q29udGVudExlbgorICAgICAgICAgICAgICAgICsgIiwgY291bnQgbGluZSBudW1iZXJzOiAiICsgY291bnRMaW5lTnVtYmVycyArICJdIjsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lUGFyc2VFdmVudEV4Y2VwdGlvbi5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVBhcnNlRXZlbnRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDAyOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVBhcnNlRXZlbnRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVFeGNlcHRpb247CisKKy8qKgorICogSW5kaWNhdGVzIHRoYXQgc3RyaWN0IHBhcnNpbmcgaGFzIGJlZW4gZW5hYmxlZCAKKyAqIGFuZCBhbiBvcHRpb25hbCBpbnZhbGl0eSBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgaW5wdXQuCisgKiB7QGxpbmsgI2dldEV2ZW50KCl9IGluZGljYXRlcyB0aGUgdHlwZSBvZiBpbnZhbGlkaXR5LgorICovCitwdWJsaWMgY2xhc3MgTWltZVBhcnNlRXZlbnRFeGNlcHRpb24gZXh0ZW5kcyBNaW1lRXhjZXB0aW9uIHsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NjMyOTkxNjA0MjQ2ODUyMzAyTDsKKyAgICBwcml2YXRlIGZpbmFsIEV2ZW50IGV2ZW50OworICAgIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIAorICAgICAqIEBwYXJhbSBldmVudCA8Y29kZT5NaW1lVG9rZW5TdHJlYW0uRXZlbnQ8L2NvZGU+LCBub3QgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBNaW1lUGFyc2VFdmVudEV4Y2VwdGlvbihmaW5hbCBFdmVudCBldmVudCkgeworICAgICAgICBzdXBlcihldmVudC50b1N0cmluZygpKTsKKyAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNhdXNhbCBwYXJzZSBldmVudC4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPk1pbWVUb2tlblN0cmVhbS5FdmVudDwvY29kZT4sIG5vdCBudWxsCisgICAgICovCisgICAgcHVibGljIEV2ZW50IGdldEV2ZW50KCkgeworICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVN0cmVhbVBhcnNlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVN0cmVhbVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NGZiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lU3RyZWFtUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkJvZHlEZXNjcmlwdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIDxwPgorICogUGFyc2VzIE1JTUUgKG9yIFJGQzgyMikgbWVzc2FnZSBzdHJlYW1zIG9mIGJ5dGVzIG9yIGNoYXJhY3RlcnMgYW5kIHJlcG9ydHMgCisgKiBwYXJzaW5nIGV2ZW50cyB0byBhIDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPiBpbnN0YW5jZS4KKyAqIDwvcD4KKyAqIDxwPgorICogVHlwaWNhbCB1c2FnZTo8YnIvPgorICogPHByZT4KKyAqICAgICAgQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBNeUhhbmRsZXIoKTsKKyAqICAgICAgTWltZVN0cmVhbVBhcnNlciBwYXJzZXIgPSBuZXcgTWltZVN0cmVhbVBhcnNlcigpOworICogICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7CisgKiAgICAgIHBhcnNlci5wYXJzZShuZXcgRmlsZUlucHV0U3RyZWFtKCJtaW1lLm1zZyIpKTsKKyAqIDwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgTWltZVN0cmVhbVBhcnNlciB7CisKKyAgICBwcml2YXRlIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBjb250ZW50RGVjb2Rpbmc7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBNaW1lVG9rZW5TdHJlYW0gbWltZVRva2VuU3RyZWFtOworCisgICAgcHVibGljIE1pbWVTdHJlYW1QYXJzZXIoZmluYWwgTWltZUVudGl0eUNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgTWltZUVudGl0eUNvbmZpZyBsb2NhbENvbmZpZzsKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2NhbENvbmZpZyA9IGNvbmZpZy5jbG9uZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9jYWxDb25maWcgPSBuZXcgTWltZUVudGl0eUNvbmZpZygpOworICAgICAgICB9CisgICAgICAgIHRoaXMubWltZVRva2VuU3RyZWFtID0gbmV3IE1pbWVUb2tlblN0cmVhbShsb2NhbENvbmZpZyk7CisgICAgICAgIHRoaXMuY29udGVudERlY29kaW5nID0gZmFsc2U7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBNaW1lU3RyZWFtUGFyc2VyKCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBwYXJzZXIgYXV0b21hdGljYWxseSBkZWNvZGVzIGJvZHkgY29udGVudAorICAgICAqIGJhc2VkIG9uIHRoZSBvbiB0aGUgTUlNRSBmaWVsZHMgd2l0aCB0aGUgc3RhbmRhcmQgZGVmYXVsdHMuCisgICAgICovIAorICAgIHB1YmxpYyBib29sZWFuIGlzQ29udGVudERlY29kaW5nKCkgeworICAgICAgICByZXR1cm4gY29udGVudERlY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgd2hldGhlciBwYXJzZXIgc2hvdWxkIGF1dG9tYXRpY2FsbHkgZGVjb2RlIGJvZHkgY29udGVudAorICAgICAqIGJhc2VkIG9uIHRoZSBvbiB0aGUgTUlNRSBmaWVsZHMgd2l0aCB0aGUgc3RhbmRhcmQgZGVmYXVsdHMuCisgICAgICovIAorICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnREZWNvZGluZyhib29sZWFuIGIpIHsKKyAgICAgICAgdGhpcy5jb250ZW50RGVjb2RpbmcgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyBhIHN0cmVhbSBvZiBieXRlcyBjb250YWluaW5nIGEgTUlNRSBtZXNzYWdlLgorICAgICAqIAorICAgICAqIEBwYXJhbSBpcyB0aGUgc3RyZWFtIHRvIHBhcnNlLgorICAgICAqIEB0aHJvd3MgTWltZUV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBjYW4gbm90IGJlIHByb2Nlc3NlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gSS9PIGVycm9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIE1pbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbWltZVRva2VuU3RyZWFtLnBhcnNlKGlzKTsKKyAgICAgICAgT1VURVI6IGZvciAoOzspIHsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG1pbWVUb2tlblN0cmVhbS5nZXRTdGF0ZSgpOworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgTWltZVRva2VuU3RyZWFtLlRfQk9EWToKKyAgICAgICAgICAgICAgICAgICAgQm9keURlc2NyaXB0b3IgZGVzYyA9IG1pbWVUb2tlblN0cmVhbS5nZXRCb2R5RGVzY3JpcHRvcigpOworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBib2R5Q29udGVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnREZWNvZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNvbnRlbnQgPSBtaW1lVG9rZW5TdHJlYW0uZ2V0RGVjb2RlZElucHV0U3RyZWFtKCk7IAorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9keUNvbnRlbnQgPSBtaW1lVG9rZW5TdHJlYW0uZ2V0SW5wdXRTdHJlYW0oKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5ib2R5KGRlc2MsIGJvZHlDb250ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQ6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZW5kQm9keVBhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmVuZEhlYWRlcigpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1pbWVUb2tlblN0cmVhbS5UX0VORF9NRVNTQUdFOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmVuZE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTVVMVElQQVJUOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmVuZE11bHRpcGFydCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1pbWVUb2tlblN0cmVhbS5UX0VORF9PRl9TVFJFQU06CisgICAgICAgICAgICAgICAgICAgIGJyZWFrIE9VVEVSOworICAgICAgICAgICAgICAgIGNhc2UgTWltZVRva2VuU3RyZWFtLlRfRVBJTE9HVUU6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuZXBpbG9ndWUobWltZVRva2VuU3RyZWFtLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmZpZWxkKG1pbWVUb2tlblN0cmVhbS5nZXRGaWVsZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNaW1lVG9rZW5TdHJlYW0uVF9QUkVBTUJMRToKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5wcmVhbWJsZShtaW1lVG9rZW5TdHJlYW0uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTWltZVRva2VuU3RyZWFtLlRfUkFXX0VOVElUWToKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5yYXcobWltZVRva2VuU3RyZWFtLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0JPRFlQQVJUOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0Qm9keVBhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVI6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc3RhcnRIZWFkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9NRVNTQUdFOgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVDoKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5zdGFydE11bHRpcGFydChtaW1lVG9rZW5TdHJlYW0uZ2V0Qm9keURlc2NyaXB0b3IoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgc3RhdGU6ICIgKyBzdGF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZSA9IG1pbWVUb2tlblN0cmVhbS5uZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIHBhcnNlciBpcyBjdXJyZW50bHkgaW4gcmF3IG1vZGUuCisgICAgICogCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpbiByYXcgbW9kZSwgPGNvZGU+ZmFsc2U8L2NvZGU+CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICogQHNlZSAjc2V0UmF3KGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSYXcoKSB7CisgICAgICAgIHJldHVybiBtaW1lVG9rZW5TdHJlYW0uaXNSYXcoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyByYXcgbW9kZS4gSW4gcmF3IG1vZGUgYWxsIGZ1dHVyZSBlbnRpdGllcyAKKyAgICAgKiAobWVzc2FnZXMgb3IgYm9keSBwYXJ0cykgaW4gdGhlIHN0cmVhbSB3aWxsIGJlIHJlcG9ydGVkIHRvIHRoZQorICAgICAqIHtAbGluayBDb250ZW50SGFuZGxlciNyYXcoSW5wdXRTdHJlYW0pfSBoYW5kbGVyIG1ldGhvZCBvbmx5LgorICAgICAqIFRoZSBzdHJlYW0gd2lsbCBjb250YWluIHRoZSBlbnRpcmUgdW5wYXJzZWQgZW50aXR5IGNvbnRlbnRzIAorICAgICAqIGluY2x1ZGluZyBoZWFkZXIgZmllbGRzIGFuZCB3aGF0ZXZlciBpcyBpbiB0aGUgYm9keS4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gcmF3IDxjb2RlPnRydWU8L2NvZGU+IGVuYWJsZXMgcmF3IG1vZGUsIDxjb2RlPmZhbHNlPC9jb2RlPgorICAgICAqICAgICAgICBkaXNhYmxlcyBpdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSYXcoYm9vbGVhbiByYXcpIHsKKyAgICAgICAgbWltZVRva2VuU3RyZWFtLnNldFJlY3Vyc2lvbk1vZGUoTWltZVRva2VuU3RyZWFtLk1fUkFXKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogRmluaXNoZXMgdGhlIHBhcnNpbmcgYW5kIHN0b3BzIHJlYWRpbmcgbGluZXMuCisgICAgICogTk9URTogTm8gbW9yZSBsaW5lcyB3aWxsIGJlIHBhcnNlZCBidXQgdGhlIHBhcnNlcgorICAgICAqIHdpbGwgc3RpbGwgY2FsbCAKKyAgICAgKiB7QGxpbmsgQ29udGVudEhhbmRsZXIjZW5kTXVsdGlwYXJ0KCl9LAorICAgICAqIHtAbGluayBDb250ZW50SGFuZGxlciNlbmRCb2R5UGFydCgpfSwKKyAgICAgKiB7QGxpbmsgQ29udGVudEhhbmRsZXIjZW5kTWVzc2FnZSgpfSwgZXRjIHRvIG1hdGNoIHByZXZpb3VzIGNhbGxzCisgICAgICogdG8gCisgICAgICoge0BsaW5rIENvbnRlbnRIYW5kbGVyI3N0YXJ0TXVsdGlwYXJ0KEJvZHlEZXNjcmlwdG9yKX0sCisgICAgICoge0BsaW5rIENvbnRlbnRIYW5kbGVyI3N0YXJ0Qm9keVBhcnQoKX0sCisgICAgICoge0BsaW5rIENvbnRlbnRIYW5kbGVyI3N0YXJ0TWVzc2FnZSgpfSwgZXRjLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIG1pbWVUb2tlblN0cmVhbS5zdG9wKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPiB0byB1c2Ugd2hlbiByZXBvcnRpbmcgCisgICAgICogcGFyc2luZyBldmVudHMuCisgICAgICogCisgICAgICogQHBhcmFtIGggdGhlIDxjb2RlPkNvbnRlbnRIYW5kbGVyPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlciBoKSB7CisgICAgICAgIHRoaXMuaGFuZGxlciA9IGg7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lVG9rZW5TdHJlYW0uamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVUb2tlblN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDEyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lVG9rZW5TdHJlYW0uamF2YQpAQCAtMCwwICsxLDM4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLkJhc2U2NElucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLlF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3IuQm9keURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uTGluZU51bWJlcklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvLkxpbmVOdW1iZXJTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5DaGFyc2V0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLk1pbWVVdGlsOworCisvKioKKyAqIDxwPgorICogUGFyc2VzIE1JTUUgKG9yIFJGQzgyMikgbWVzc2FnZSBzdHJlYW1zIG9mIGJ5dGVzIG9yIGNoYXJhY3RlcnMuCisgKiBUaGUgc3RyZWFtIGlzIGNvbnZlcnRlZCBpbnRvIGFuIGV2ZW50IHN0cmVhbS4KKyAqIDxwPgorICogPHA+CisgKiBUeXBpY2FsIHVzYWdlOgorICogPC9wPgorICogPHByZT4KKyAqICAgICAgTWltZVRva2VuU3RyZWFtIHN0cmVhbSA9IG5ldyBNaW1lVG9rZW5TdHJlYW0oKTsKKyAqICAgICAgc3RyZWFtLnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oIm1pbWUubXNnIikpOworICogICAgICBmb3IgKGludCBzdGF0ZSA9IHN0cmVhbS5nZXRTdGF0ZSgpOworICogICAgICAgICAgIHN0YXRlICE9IE1pbWVUb2tlblN0cmVhbS5UX0VORF9PRl9TVFJFQU07CisgKiAgICAgICAgICAgc3RhdGUgPSBzdHJlYW0ubmV4dCgpKSB7CisgKiAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgKiAgICAgICAgICAgIGNhc2UgTWltZVRva2VuU3RyZWFtLlRfQk9EWToKKyAqICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkJvZHkgZGV0ZWN0ZWQsIGNvbnRlbnRzID0gIgorICogICAgICAgICAgICAgICAgKyBzdHJlYW0uZ2V0SW5wdXRTdHJlYW0oKSArICIsIGhlYWRlciBkYXRhID0gIgorICogICAgICAgICAgICAgICAgKyBzdHJlYW0uZ2V0Qm9keURlc2NyaXB0b3IoKSk7CisgKiAgICAgICAgICAgICAgYnJlYWs7CisgKiAgICAgICAgICAgIGNhc2UgTWltZVRva2VuU3RyZWFtLlRfRklFTEQ6CisgKiAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWFkZXIgZmllbGQgZGV0ZWN0ZWQ6ICIKKyAqICAgICAgICAgICAgICAgICsgc3RyZWFtLmdldEZpZWxkKCkpOworICogICAgICAgICAgICAgIGJyZWFrOworICogICAgICAgICAgICBjYXNlIE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVDoKKyAqICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk11bHRpcGFydCBtZXNzYWdlIGRldGV4dGVkLCIKKyAqICAgICAgICAgICAgICAgICsgIiBoZWFkZXIgZGF0YSA9ICIKKyAqICAgICAgICAgICAgICAgICsgc3RyZWFtLmdldEJvZHlEZXNjcmlwdG9yKCkpOworICogICAgICAgICAgICAuLi4KKyAqICAgICAgICAgIH0KKyAqICAgICAgfQorICogPC9wcmU+CisgKiA8cD5JbnN0YW5jZXMgb2Yge0BsaW5rIE1pbWVUb2tlblN0cmVhbX0gYXJlIHJldXNhYmxlOiBJbnZva2luZyB0aGUKKyAqIG1ldGhvZCB7QGxpbmsgI3BhcnNlKElucHV0U3RyZWFtKX0gcmVzZXRzIHRoZSB0b2tlbiBzdHJlYW1zIGludGVybmFsCisgKiBzdGF0ZS4gSG93ZXZlciwgdGhleSBhcmUgZGVmaW5pdGVseSA8ZW0+bm90PC9lbT4gdGhyZWFkIHNhZmUuIElmIHlvdQorICogaGF2ZSBhIG11bHRpIHRocmVhZGVkIGFwcGxpY2F0aW9uLCB0aGVuIHRoZSBzdWdnZXN0ZWQgdXNlIGlzIHRvIGhhdmUKKyAqIG9uZSBpbnN0YW5jZSBwZXIgdGhyZWFkLjwvcD4KKyAqLworcHVibGljIGNsYXNzIE1pbWVUb2tlblN0cmVhbSBpbXBsZW1lbnRzIEVudGl0eVN0YXRlcywgUmVjdXJzaW9uTW9kZSB7CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IGNyZWF0ZXMgYSBtb3JlIGRldGFpbGVkIGJvZHkgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIDxjb2RlPk1pbWVUb2tlblN0cmVhbTwvY29kZT4sIG5vdCBudWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNaW1lVG9rZW5TdHJlYW0gY3JlYXRlTWF4aW1hbERlc2NyaXB0b3JTdHJlYW0oKSB7CisgICAgICAgIE1pbWVFbnRpdHlDb25maWcgY29uZmlnID0gbmV3IE1pbWVFbnRpdHlDb25maWcoKTsKKyAgICAgICAgY29uZmlnLnNldE1heGltYWxCb2R5RGVzY3JpcHRvcih0cnVlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBNaW1lVG9rZW5TdHJlYW0oY29uZmlnKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHN0cmljdGx5IHZhbGlkYXRlcyB0aGUgaW5wdXQuCisgICAgICogQHJldHVybiA8Y29kZT5NaW1lVG9rZW5TdHJlYW08L2NvZGU+IHdoaWNoIHRocm93cyBhIAorICAgICAqIDxjb2RlPk1pbWVFeGNlcHRpb248L2NvZGU+IHdoZW5ldmVyIHBvc3NpYmxlIGlzc3VlcyAKKyAgICAgKiBhcmUgZGVkaWNhdGVkIGluIHRoZSBpbnB1dAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWltZVRva2VuU3RyZWFtIGNyZWF0ZVN0cmljdFZhbGlkYXRpb25TdHJlYW0oKSB7CisgICAgICAgIE1pbWVFbnRpdHlDb25maWcgY29uZmlnID0gbmV3IE1pbWVFbnRpdHlDb25maWcoKTsKKyAgICAgICAgY29uZmlnLnNldFN0cmljdFBhcnNpbmcodHJ1ZSk7CisgICAgICAgIHJldHVybiBuZXcgTWltZVRva2VuU3RyZWFtKGNvbmZpZyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgZmluYWwgTWltZUVudGl0eUNvbmZpZyBjb25maWc7CisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0PEVudGl0eVN0YXRlTWFjaGluZT4gZW50aXRpZXMgPSBuZXcgTGlua2VkTGlzdDxFbnRpdHlTdGF0ZU1hY2hpbmU+KCk7CisgICAgCisgICAgcHJpdmF0ZSBpbnQgc3RhdGUgPSBUX0VORF9PRl9TVFJFQU07CisgICAgcHJpdmF0ZSBFbnRpdHlTdGF0ZU1hY2hpbmUgY3VycmVudFN0YXRlTWFjaGluZTsKKyAgICBwcml2YXRlIGludCByZWN1cnNpb25Nb2RlID0gTV9SRUNVUlNFOworICAgIHByaXZhdGUgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5idWZmZXI7CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHN0YW5kYXJkIChsYXgpIHN0cmVhbS4KKyAgICAgKiBPcHRpb25hbCB2YWxpZGF0aW9uIGV2ZW50cyB3aWxsIGJlIGxvZ2dlZCBvbmx5LgorICAgICAqIFVzZSB7QGxpbmsgI2NyZWF0ZVN0cmljdFZhbGlkYXRpb25TdHJlYW0oKX0gdG8gY3JlYXRlCisgICAgICogYSBzdHJlYW0gdGhhdCBzdHJpY3RseSB2YWxpZGF0ZXMgdGhlIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBNaW1lVG9rZW5TdHJlYW0oKSB7CisgICAgICAgIHRoaXMobmV3IE1pbWVFbnRpdHlDb25maWcoKSk7CisgICAgfQorICAgIAorICAgIHByb3RlY3RlZCBNaW1lVG9rZW5TdHJlYW0oZmluYWwgTWltZUVudGl0eUNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgfQorICAgIAorICAgIC8qKiBJbnN0cnVjdHMgdGhlIHtAY29kZSBNaW1lVG9rZW5TdHJlYW19IHRvIHBhcnNlIHRoZSBnaXZlbiBzdHJlYW1zIGNvbnRlbnRzLgorICAgICAqIElmIHRoZSB7QGNvZGUgTWltZVRva2VuU3RyZWFtfSBoYXMgYWxyZWFkeSBiZWVuIGluIHVzZSwgcmVzZXRzIHRoZSBzdHJlYW1zCisgICAgICogaW50ZXJuYWwgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIGRvUGFyc2Uoc3RyZWFtLCBudWxsKTsKKyAgICB9CisKKyAgICAvKiogSW5zdHJ1Y3RzIHRoZSB7QGNvZGUgTWltZVRva2VuU3RyZWFtfSB0byBwYXJzZSB0aGUgZ2l2ZW4gY29udGVudCB3aXRoIAorICAgICAqIHRoZSBjb250ZW50IHR5cGUuIFRoZSBtZXNzYWdlIHN0cmVhbSBpcyBhc3N1bWVkIHRvIGhhdmUgbm8gbWVzc2FnZSBoZWFkZXIKKyAgICAgKiBhbmQgaXMgZXhwZWN0ZWQgdG8gYmVnaW4gd2l0aCBhIG1lc3NhZ2UgYm9keS4gVGhpcyBjYW4gYmUgdGhlIGNhc2Ugd2hlbiAKKyAgICAgKiB0aGUgbWVzc2FnZSBjb250ZW50IGlzIHRyYW5zbWl0dGVkIHVzaW5nIGEgZGlmZmVyZW50IHRyYW5zcG9ydCBwcm90b2NvbCAKKyAgICAgKiBzdWNoIGFzIEhUVFAuCisgICAgICogPHAvPgorICAgICAqIElmIHRoZSB7QGNvZGUgTWltZVRva2VuU3RyZWFtfSBoYXMgYWxyZWFkeSBiZWVuIGluIHVzZSwgcmVzZXRzIHRoZSBzdHJlYW1zCisgICAgICogaW50ZXJuYWwgc3RhdGUuCisgICAgICovICAgIAorICAgIHB1YmxpYyB2b2lkIHBhcnNlSGVhZGxlc3MoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgY29udGVudFR5cGUpIHsKKyAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRlbnQgdHlwZSBtYXkgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBkb1BhcnNlKHN0cmVhbSwgY29udGVudFR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1BhcnNlKElucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIGVudGl0aWVzLmNsZWFyKCk7CisKKyAgICAgICAgTGluZU51bWJlclNvdXJjZSBsaW5lU291cmNlID0gbnVsbDsKKyAgICAgICAgaWYgKGNvbmZpZy5pc0NvdW50TGluZU51bWJlcnMoKSkgeworICAgICAgICAgICAgTGluZU51bWJlcklucHV0U3RyZWFtIGxpbmVJbnB1dCA9IG5ldyBMaW5lTnVtYmVySW5wdXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgIGxpbmVTb3VyY2UgPSBsaW5lSW5wdXQ7CisgICAgICAgICAgICBzdHJlYW0gPSBsaW5lSW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBpbmJ1ZmZlciA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBzdHJlYW0sIAorICAgICAgICAgICAgICAgIDQgKiAxMDI0LAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRNYXhMaW5lTGVuKCkpOworICAgICAgICBzd2l0Y2ggKHJlY3Vyc2lvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBNX1JBVzoKKyAgICAgICAgICAgIFJhd0VudGl0eSByYXdlbnRpdHkgPSBuZXcgUmF3RW50aXR5KGluYnVmZmVyKTsKKyAgICAgICAgICAgIGN1cnJlbnRTdGF0ZU1hY2hpbmUgPSByYXdlbnRpdHk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNX05PX1JFQ1VSU0U6CisgICAgICAgIGNhc2UgTV9GTEFUOgorICAgICAgICAgICAgLy8gZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIG9ubHkgYXQgc3RhcnQgb2YgcGFyaW5nCisgICAgICAgIGNhc2UgTV9SRUNVUlNFOgorICAgICAgICAgICAgTWltZUVudGl0eSBtaW1lZW50aXR5ID0gbmV3IE1pbWVFbnRpdHkoCisgICAgICAgICAgICAgICAgICAgIGxpbmVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGluYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBudWxsLCAKKyAgICAgICAgICAgICAgICAgICAgVF9TVEFSVF9NRVNTQUdFLCAKKyAgICAgICAgICAgICAgICAgICAgVF9FTkRfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnKTsKKyAgICAgICAgICAgIG1pbWVlbnRpdHkuc2V0UmVjdXJzaW9uTW9kZShyZWN1cnNpb25Nb2RlKTsKKyAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWltZWVudGl0eS5za2lwSGVhZGVyKGNvbnRlbnRUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRTdGF0ZU1hY2hpbmUgPSBtaW1lZW50aXR5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZW50aXRpZXMuYWRkKGN1cnJlbnRTdGF0ZU1hY2hpbmUpOworICAgICAgICBzdGF0ZSA9IGN1cnJlbnRTdGF0ZU1hY2hpbmUuZ2V0U3RhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoaXMgcGFyc2VyIGlzIGN1cnJlbnRseSBpbiByYXcgbW9kZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGluIHJhdyBtb2RlLCA8Y29kZT5mYWxzZTwvY29kZT4KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNzZXRSZWN1cnNpb25Nb2RlKGludCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdygpIHsKKyAgICAgICAgcmV0dXJuIHJlY3Vyc2lvbk1vZGUgPT0gTV9SQVc7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgcmVjdXJzaW9uIG1vZGUuCisgICAgICogVGhlIHJlY3Vyc2lvbiBtb2RlIHNwZWNpZmllcyB0aGUgYXBwcm9hY2ggdGFrZW4gdG8gcGFyc2luZyBwYXJ0cy4KKyAgICAgKiB7QGxpbmsgI01fUkFXfSAgbW9kZSBkb2VzIG5vdCBwYXJzZSB0aGUgcGFydCBhdCBhbGwuCisgICAgICoge0BsaW5rICNNX1JFQ1VSU0V9IG1vZGUgcmVjdXJzaXZlbHkgcGFyc2VzIGVhY2ggbWFpbAorICAgICAqIHdoZW4gYW4gPGNvZGU+bWVzc2FnZS9yZmM4MjI8L2NvZGU+IHBhcnQgaXMgZW5jb3VudGVkOworICAgICAqIHtAbGluayAjTV9OT19SRUNVUlNFfSBkb2VzIG5vdC4KKyAgICAgKiBAcmV0dXJuIHtAbGluayAjTV9SRUNVUlNFfSwge0BsaW5rICNNX1JBV30gb3Ige0BsaW5rICNNX05PX1JFQ1VSU0V9CisgICAgICovCisgICAgcHVibGljIGludCBnZXRSZWN1cnNpb25Nb2RlKCkgeworICAgICAgICByZXR1cm4gcmVjdXJzaW9uTW9kZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3VycmVudCByZWN1cnNpb24uCisgICAgICogVGhlIHJlY3Vyc2lvbiBtb2RlIHNwZWNpZmllcyB0aGUgYXBwcm9hY2ggdGFrZW4gdG8gcGFyc2luZyBwYXJ0cy4KKyAgICAgKiB7QGxpbmsgI01fUkFXfSAgbW9kZSBkb2VzIG5vdCBwYXJzZSB0aGUgcGFydCBhdCBhbGwuCisgICAgICoge0BsaW5rICNNX1JFQ1VSU0V9IG1vZGUgcmVjdXJzaXZlbHkgcGFyc2VzIGVhY2ggbWFpbAorICAgICAqIHdoZW4gYW4gPGNvZGU+bWVzc2FnZS9yZmM4MjI8L2NvZGU+IHBhcnQgaXMgZW5jb3VudGVkOworICAgICAqIHtAbGluayAjTV9OT19SRUNVUlNFfSBkb2VzIG5vdC4KKyAgICAgKiBAcGFyYW0gbW9kZSB7QGxpbmsgI01fUkVDVVJTRX0sIHtAbGluayAjTV9SQVd9IG9yIHtAbGluayAjTV9OT19SRUNVUlNFfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlY3Vyc2lvbk1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgcmVjdXJzaW9uTW9kZSA9IG1vZGU7CisgICAgICAgIGlmIChjdXJyZW50U3RhdGVNYWNoaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN1cnJlbnRTdGF0ZU1hY2hpbmUuc2V0UmVjdXJzaW9uTW9kZShtb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmlzaGVzIHRoZSBwYXJzaW5nIGFuZCBzdG9wcyByZWFkaW5nIGxpbmVzLgorICAgICAqIE5PVEU6IE5vIG1vcmUgbGluZXMgd2lsbCBiZSBwYXJzZWQgYnV0IHRoZSBwYXJzZXIKKyAgICAgKiB3aWxsIHN0aWxsIGNhbGwgCisgICAgICoge0BsaW5rIENvbnRlbnRIYW5kbGVyI2VuZE11bHRpcGFydCgpfSwKKyAgICAgKiB7QGxpbmsgQ29udGVudEhhbmRsZXIjZW5kQm9keVBhcnQoKX0sCisgICAgICoge0BsaW5rIENvbnRlbnRIYW5kbGVyI2VuZE1lc3NhZ2UoKX0sIGV0YyB0byBtYXRjaCBwcmV2aW91cyBjYWxscworICAgICAqIHRvIAorICAgICAqIHtAbGluayBDb250ZW50SGFuZGxlciNzdGFydE11bHRpcGFydChCb2R5RGVzY3JpcHRvcil9LAorICAgICAqIHtAbGluayBDb250ZW50SGFuZGxlciNzdGFydEJvZHlQYXJ0KCl9LAorICAgICAqIHtAbGluayBDb250ZW50SGFuZGxlciNzdGFydE1lc3NhZ2UoKX0sIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBpbmJ1ZmZlci50cnVuY2F0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJhdyBlbnRpdHksIHByZWFtYmxlLCBvciBlcGlsb2d1ZSBjb250ZW50cy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2QgaXMgdmFsaWQsIGlmIHtAbGluayAjZ2V0U3RhdGUoKX0gcmV0dXJucyBlaXRoZXIgb2YKKyAgICAgKiB7QGxpbmsgI1RfUkFXX0VOVElUWX0sIHtAbGluayAjVF9QUkVBTUJMRX0sIG9yIHtAbGluayAjVF9FUElMT0dVRX0uCisgICAgICogCisgICAgICogQHJldHVybiBEYXRhIHN0cmVhbSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHtAbGluayAjZ2V0U3RhdGUoKX0gcmV0dXJucyBhbgorICAgICAqICAgaW52YWxpZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50U3RhdGVNYWNoaW5lLmdldENvbnRlbnRTdHJlYW0oKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHRyYW5zZmVyIGRlY29kZWQgc3RyZWFtIGJhc2VkIG9uIHRoZSBNSU1FIAorICAgICAqIGZpZWxkcyB3aXRoIHRoZSBzdGFuZGFyZCBkZWZhdWx0cy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2QgaXMgdmFsaWQsIGlmIHtAbGluayAjZ2V0U3RhdGUoKX0gcmV0dXJucyBlaXRoZXIgb2YKKyAgICAgKiB7QGxpbmsgI1RfUkFXX0VOVElUWX0sIHtAbGluayAjVF9QUkVBTUJMRX0sIG9yIHtAbGluayAjVF9FUElMT0dVRX0uCisgICAgICogCisgICAgICogQHJldHVybiBEYXRhIHN0cmVhbSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHN0YXRlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHtAbGluayAjZ2V0U3RhdGUoKX0gcmV0dXJucyBhbgorICAgICAqICAgaW52YWxpZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RGVjb2RlZElucHV0U3RyZWFtKCkgeworICAgICAgICBCb2R5RGVzY3JpcHRvciBib2R5RGVzY3JpcHRvciA9IGdldEJvZHlEZXNjcmlwdG9yKCk7CisgICAgICAgIFN0cmluZyB0cmFuc2ZlckVuY29kaW5nID0gYm9keURlc2NyaXB0b3IuZ2V0VHJhbnNmZXJFbmNvZGluZygpOworICAgICAgICBJbnB1dFN0cmVhbSBkYXRhU3RyZWFtID0gY3VycmVudFN0YXRlTWFjaGluZS5nZXRDb250ZW50U3RyZWFtKCk7CisgICAgICAgIGlmIChNaW1lVXRpbC5pc0Jhc2U2NEVuY29kaW5nKHRyYW5zZmVyRW5jb2RpbmcpKSB7CisgICAgICAgICAgICBkYXRhU3RyZWFtID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGRhdGFTdHJlYW0pOworICAgICAgICB9IGVsc2UgaWYgKE1pbWVVdGlsLmlzUXVvdGVkUHJpbnRhYmxlRW5jb2RlZCh0cmFuc2ZlckVuY29kaW5nKSkgeworICAgICAgICAgICAgZGF0YVN0cmVhbSA9IG5ldyBRdW90ZWRQcmludGFibGVJbnB1dFN0cmVhbShkYXRhU3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YVN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgcmVhZGVyIGNvbmZpZ3VyZWQgZm9yIHRoZSBjdXJyZW50IGJvZHkgb3IgYm9keSBwYXJ0LgorICAgICAqIFRoZSByZWFkZXIgd2lsbCByZXR1cm4gYSB0cmFuc2ZlciBhbmQgY2hhcnNldCBkZWNvZGVkIAorICAgICAqIHN0cmVhbSBvZiBjaGFyYWN0ZXJzIGJhc2VkIG9uIHRoZSBNSU1FIGZpZWxkcyB3aXRoIHRoZSBzdGFuZGFyZAorICAgICAqIGRlZmF1bHRzLgorICAgICAqIFRoaXMgaXMgYSBjb252ZW5pYW5jZSBtZXRob2QgYW5kIHJlbGllcyBvbiB7QGxpbmsgI2dldElucHV0U3RyZWFtKCl9LgorICAgICAqIENvbnN1bHQgdGhlIGphdmFkb2MgZm9yIHRoYXQgbWV0aG9kIGZvciBrbm93biBsaW1pdGF0aW9ucy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIDxjb2RlPlJlYWRlcjwvY29kZT4sIG5vdCBudWxsCisgICAgICogQHNlZSAjZ2V0SW5wdXRTdHJlYW0gCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ge0BsaW5rICNnZXRTdGF0ZSgpfSByZXR1cm5zIGFuCisgICAgICogICBpbnZhbGlkIHZhbHVlIAorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIEpWTSBzdXBwb3J0IAorICAgICAqIGZvciBkZWNvZGluZyB0aGUgY2hhcnNldAorICAgICAqIEB0aHJvd3MgSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGlmIHRoZSBjaGFyc2V0IG5hbWUgc3BlY2lmaWVkCisgICAgICogaW4gdGhlIG1pbWUgdHlwZSBpcyBpbGxlZ2FsCisgICAgICovCisgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB7CisgICAgICAgIGZpbmFsIEJvZHlEZXNjcmlwdG9yIGJvZHlEZXNjcmlwdG9yID0gZ2V0Qm9keURlc2NyaXB0b3IoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVDaGFyc2V0ID0gYm9keURlc2NyaXB0b3IuZ2V0Q2hhcnNldCgpOworICAgICAgICBmaW5hbCBDaGFyc2V0IGNoYXJzZXQ7CisgICAgICAgIGlmIChtaW1lQ2hhcnNldCA9PSBudWxsIHx8ICIiLmVxdWFscyhtaW1lQ2hhcnNldCkpIHsKKyAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0VXRpbC5VU19BU0NJSTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUobWltZUNoYXJzZXQpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGluc3RyZWFtID0gZ2V0RGVjb2RlZElucHV0U3RyZWFtKCk7CisgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5zdHJlYW0sIGNoYXJzZXQpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiA8cD5HZXRzIGEgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgZW50aXR5LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHZhbGlkIGlmIHtAbGluayAjZ2V0U3RhdGUoKX0gcmV0dXJuczo8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgI1RfQk9EWX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI1RfU1RBUlRfTVVMVElQQVJUfTwvbGk+CisgICAgICogPGxpPntAbGluayAjVF9FUElMT0dVRX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgI1RfUFJFQU1CTEV9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIEByZXR1cm4gPGNvZGU+Qm9keURlc2NyaXB0b3I8L2NvZGU+LCBub3QgbnVsbHMKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9keURlc2NyaXB0b3IgZ2V0Qm9keURlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50U3RhdGVNYWNoaW5lLmdldEJvZHlEZXNjcmlwdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgdmFsaWQsIGlmIHtAbGluayAjZ2V0U3RhdGUoKX0gcmV0dXJucyB7QGxpbmsgI1RfRklFTER9LgorICAgICAqIEByZXR1cm4gU3RyaW5nIHdpdGggdGhlIGZpZWxkcyByYXcgY29udGVudHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24ge0BsaW5rICNnZXRTdGF0ZSgpfSByZXR1cm5zIGFub3RoZXIKKyAgICAgKiAgIHZhbHVlIHRoYW4ge0BsaW5rICNUX0ZJRUxEfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmllbGQgZ2V0RmllbGQoKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50U3RhdGVNYWNoaW5lLmdldEZpZWxkKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGFkdmFuY2VzIHRoZSB0b2tlbiBzdHJlYW0gdG8gdGhlIG5leHQgdG9rZW4uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhlIG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQsIGFsdGhvdWdoCisgICAgICogICB7QGxpbmsgI2dldFN0YXRlKCl9IHdhcyBhbHJlYWR5IHtAbGluayAjVF9FTkRfT0ZfU1RSRUFNfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1pbWVFeGNlcHRpb24geworICAgICAgICBpZiAoc3RhdGUgPT0gVF9FTkRfT0ZfU1RSRUFNICB8fCAgY3VycmVudFN0YXRlTWFjaGluZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBtb3JlIHRva2VucyBhcmUgYXZhaWxhYmxlLiIpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjdXJyZW50U3RhdGVNYWNoaW5lICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVudGl0eVN0YXRlTWFjaGluZSBuZXh0ID0gY3VycmVudFN0YXRlTWFjaGluZS5hZHZhbmNlKCk7CisgICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZW50aXRpZXMuYWRkKG5leHQpOworICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZU1hY2hpbmUgPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUgPSBjdXJyZW50U3RhdGVNYWNoaW5lLmdldFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoc3RhdGUgIT0gVF9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50aXRpZXMucmVtb3ZlTGFzdCgpOworICAgICAgICAgICAgaWYgKGVudGl0aWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZU1hY2hpbmUgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGVNYWNoaW5lID0gZW50aXRpZXMuZ2V0TGFzdCgpOworICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZU1hY2hpbmUuc2V0UmVjdXJzaW9uTW9kZShyZWN1cnNpb25Nb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IFRfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbmRlcnMgYSBzdGF0ZSBhcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgbG9nZ2luZy4KKyAgICAgKiBAcGFyYW0gc3RhdGUgCisgICAgICogQHJldHVybiByZW5kZXJlZCBhcyBzdHJpbmcsIG5vdCBudWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RhdGVUb1N0cmluZyhpbnQgc3RhdGUpIHsKKyAgICAgICAgcmV0dXJuIEFic3RyYWN0RW50aXR5LnN0YXRlVG9TdHJpbmcoc3RhdGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL1Jhd0VudGl0eS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvUmF3RW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZjAzNQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL1Jhd0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvci5Cb2R5RGVzY3JpcHRvcjsNCisNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCisNCisvKioNCisgKiBSYXcgTUlNRSBlbnRpdHkuIFN1Y2ggZW50aXRpZXMgd2lsbCBub3QgYmUgcGFyc2VkIGludG8gZWxlbWVudHMgDQorICogYnkgdGhlIHBhcnNlci4gVGhleSBhcmUgbWVhbnQgdG8gYmUgY29uc3VtZWQgYXMgYSByYXcgZGF0YSBzdHJlYW0NCisgKiBieSB0aGUgY2FsbGVyLiAgDQorICovDQorcHVibGljIGNsYXNzIFJhd0VudGl0eSBpbXBsZW1lbnRzIEVudGl0eVN0YXRlTWFjaGluZSB7DQorDQorICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtOw0KKw0KKyAgICBwcml2YXRlIGludCBzdGF0ZTsNCisgICAgDQorICAgIFJhd0VudGl0eShJbnB1dFN0cmVhbSBzdHJlYW0pIHsNCisgICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOw0KKyAgICAgICAgdGhpcy5zdGF0ZSA9IEVudGl0eVN0YXRlcy5UX1JBV19FTlRJVFk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7DQorICAgICAgICByZXR1cm4gc3RhdGU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBzZXRSZWN1cnNpb25Nb2RlKGludCByZWN1cnNpb25Nb2RlKSB7DQorICAgIH0NCisNCisgICAgcHVibGljIEVudGl0eVN0YXRlTWFjaGluZSBhZHZhbmNlKCkgew0KKyAgICAgICAgc3RhdGUgPSBFbnRpdHlTdGF0ZXMuVF9FTkRfT0ZfU1RSRUFNOw0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHJhdyBkYXRhIHN0cmVhbS4NCisgICAgICovDQorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50U3RyZWFtKCkgew0KKyAgICAgICAgcmV0dXJuIHN0cmVhbTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBhbmQgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgQm9keURlc2NyaXB0b3IgZ2V0Qm9keURlc2NyaXB0b3IoKSB7DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBhbmQgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgRmllbGQgZ2V0RmllbGQoKSB7DQorICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBhbmQgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGFuZCBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4NCisgICAgICovDQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRWYWx1ZSgpIHsNCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorICAgIA0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9SYXdGaWVsZC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvUmF3RmllbGQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY2NzJhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvUmF3RmllbGQuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ29udGVudFV0aWw7CisKKy8qKgorICogVGhlIGJhc2ljIGltbXV0YWJsZSBNSU1FIGZpZWxkLgorICovCitjbGFzcyBSYXdGaWVsZCBpbXBsZW1lbnRzIEZpZWxkIHsKKworICAgIHByaXZhdGUgZmluYWwgQnl0ZVNlcXVlbmNlIHJhdzsKKyAgICBwcml2YXRlIGludCBjb2xvbklkeDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgYm9keTsKKworICAgIHB1YmxpYyBSYXdGaWVsZChCeXRlU2VxdWVuY2UgcmF3LCBpbnQgY29sb25JZHgpIHsKKyAgICAgICAgdGhpcy5yYXcgPSByYXc7CisgICAgICAgIHRoaXMuY29sb25JZHggPSBjb2xvbklkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIG5hbWUgPSBwYXJzZU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm9keSgpIHsKKyAgICAgICAgaWYgKGJvZHkgPT0gbnVsbCkgeworICAgICAgICAgICAgYm9keSA9IHBhcnNlQm9keSgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJvZHk7CisgICAgfQorCisgICAgcHVibGljIEJ5dGVTZXF1ZW5jZSBnZXRSYXcoKSB7CisgICAgICAgIHJldHVybiByYXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldE5hbWUoKSArICc6JyArIGdldEJvZHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBDb250ZW50VXRpbC5kZWNvZGUocmF3LCAwLCBjb2xvbklkeCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VCb2R5KCkgeworICAgICAgICBpbnQgb2Zmc2V0ID0gY29sb25JZHggKyAxOworICAgICAgICBpbnQgbGVuZ3RoID0gcmF3Lmxlbmd0aCgpIC0gb2Zmc2V0OworICAgICAgICByZXR1cm4gQ29udGVudFV0aWwuZGVjb2RlKHJhdywgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvUmVjdXJzaW9uTW9kZS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvUmVjdXJzaW9uTW9kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjU4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9SZWN1cnNpb25Nb2RlLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOw0KKw0KKy8qKg0KKyAqIEVudW1lcmF0aW9uIG9mIHBhcnNpbmcgbW9kZXMuDQorICovDQorcHVibGljIGludGVyZmFjZSBSZWN1cnNpb25Nb2RlIHsNCisNCisgICAgLyoqIA0KKyAgICAgKiBSZWN1cnNpdmVseSBwYXJzZSBldmVyeSA8Y29kZT5tZXNzYWdlL3JmYzgyMjwvY29kZT4gcGFydCANCisgICAgICovDQorICAgIGludCBNX1JFQ1VSU0UgPSAwOw0KKyAgICAvKioNCisgICAgICogRG8gbm90IHJlY3Vyc2UgPGNvZGU+bWVzc2FnZS9yZmM4MjI8L2NvZGU+IHBhcnRzIA0KKyAgICAgKi8NCisgICAgaW50IE1fTk9fUkVDVVJTRSA9IDE7DQorICAgIC8qKiANCisgICAgICogUGFyc2UgaW50byByYXcgZW50aXRpZXMNCisgICAgICovDQorICAgIGludCBNX1JBVyA9IDI7DQorICAgIC8qKg0KKyAgICAgKiBEbyBub3QgcmVjdXJzZSA8Y29kZT5tZXNzYWdlL3JmYzgyMjwvY29kZT4gcGFydHMNCisgICAgICogYW5kIHRyZWF0IG11bHRpcGFydHMgYXMgYSBzaW5nbGUgZmxhdCBib2R5LiANCisgICAgICovDQorICAgIGludCBNX0ZMQVQgPSAzOw0KKyAgICANCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZVByb3ZpZGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvQWJzdHJhY3RTdG9yYWdlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODA0NmM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL0Fic3RyYWN0U3RvcmFnZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWMuQ29kZWNVdGlsOworCisvKioKKyAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBTdG9yYWdlUHJvdmlkZXJ9IHRoYXQgaW1wbGVtZW50cworICoge0BsaW5rIFN0b3JhZ2VQcm92aWRlciNzdG9yZShJbnB1dFN0cmVhbSkgc3RvcmUoSW5wdXRTdHJlYW0pfSBieSBjb3B5aW5nIHRoZQorICogaW5wdXQgc3RyZWFtIHRvIGEge0BsaW5rIFN0b3JhZ2VPdXRwdXRTdHJlYW19IG9idGFpbmVkIGZyb20KKyAqIHtAbGluayBTdG9yYWdlUHJvdmlkZXIjY3JlYXRlU3RvcmFnZU91dHB1dFN0cmVhbSgpIGNyZWF0ZVN0b3JhZ2VPdXRwdXRTdHJlYW0oKX0uCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0b3JhZ2VQcm92aWRlciBpbXBsZW1lbnRzIFN0b3JhZ2VQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdFN0b3JhZ2VQcm92aWRlcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGNyZWF0ZXMgYSB7QGxpbmsgU3RvcmFnZU91dHB1dFN0cmVhbX0gYnkgY2FsbGluZworICAgICAqIHtAbGluayBTdG9yYWdlUHJvdmlkZXIjY3JlYXRlU3RvcmFnZU91dHB1dFN0cmVhbSgpIGNyZWF0ZVN0b3JhZ2VPdXRwdXRTdHJlYW0oKX0KKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gdGhhdCBvdXRwdXQgc3RyZWFtLgorICAgICAqIEl0IHRoZW4gY2FsbHMge0BsaW5rIFN0b3JhZ2VPdXRwdXRTdHJlYW0jdG9TdG9yYWdlKCl9IG9uIHRoZSBvdXRwdXQKKyAgICAgKiBzdHJlYW0gYW5kIHJldHVybnMgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4KKyAgICAgKiAgICAgICAgICAgIHN0cmVhbSBjb250YWluaW5nIHRoZSBkYXRhIHRvIHN0b3JlLgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgU3RvcmFnZX0gaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUKKyAgICAgKiAgICAgICAgIHN0b3JlZCBjb250ZW50LgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdG9yYWdlIHN0b3JlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdG9yYWdlT3V0cHV0U3RyZWFtIG91dCA9IGNyZWF0ZVN0b3JhZ2VPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ29kZWNVdGlsLmNvcHkoaW4sIG91dCk7CisgICAgICAgIHJldHVybiBvdXQudG9TdG9yYWdlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvQ2lwaGVyU3RvcmFnZVByb3ZpZGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvQ2lwaGVyU3RvcmFnZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyMTZjNwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9DaXBoZXJTdG9yYWdlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKK2ltcG9ydCBqYXZheC5jcnlwdG8uQ2lwaGVySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uS2V5R2VuZXJhdG9yOworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLlNlY3JldEtleVNwZWM7CisKKy8qKgorICogQSB7QGxpbmsgU3RvcmFnZVByb3ZpZGVyfSB0aGF0IHRyYW5zcGFyZW50bHkgc2NyYW1ibGVzIGFuZCB1bnNjcmFtYmxlcyB0aGUKKyAqIGRhdGEgc3RvcmVkIGJ5IGFub3RoZXIgPGNvZGU+U3RvcmFnZVByb3ZpZGVyPC9jb2RlPi4KKyAqCisgKiA8cD4KKyAqIEV4YW1wbGUgdXNhZ2U6CisgKgorICogPHByZT4KKyAqIFN0b3JhZ2VQcm92aWRlciBtaXN0cnVzdGVkID0gbmV3IFRlbXBGaWxlU3RvcmFnZVByb3ZpZGVyKCk7CisgKiBTdG9yYWdlUHJvdmlkZXIgZW5jaXBoZXJlZCA9IG5ldyBDaXBoZXJTdG9yYWdlUHJvdmlkZXIobWlzdHJ1c3RlZCk7CisgKiBTdG9yYWdlUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgVGhyZXNob2xkU3RvcmFnZVByb3ZpZGVyKGVuY2lwaGVyZWQpOworICogRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5zZXRJbnN0YW5jZShwcm92aWRlcik7CisgKiA8L3ByZT4KKyAqLworcHVibGljIGNsYXNzIENpcGhlclN0b3JhZ2VQcm92aWRlciBleHRlbmRzIEFic3RyYWN0U3RvcmFnZVByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RvcmFnZVByb3ZpZGVyIGJhY2tlbmQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWxnb3JpdGhtOworICAgIHByaXZhdGUgZmluYWwgS2V5R2VuZXJhdG9yIGtleWdlbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2lwaGVyU3RvcmFnZVByb3ZpZGVyPC9jb2RlPiBmb3IgdGhlIGdpdmVuIGJhY2stZW5kCisgICAgICogdXNpbmcgdGhlIEJsb3dmaXNoIGNpcGhlciBhbGdvcml0aG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFja2VuZAorICAgICAqICAgICAgICAgICAgYmFjay1lbmQgc3RvcmFnZSBzdHJhdGVneSB0byBlbmNyeXB0LgorICAgICAqLworICAgIHB1YmxpYyBDaXBoZXJTdG9yYWdlUHJvdmlkZXIoU3RvcmFnZVByb3ZpZGVyIGJhY2tlbmQpIHsKKyAgICAgICAgdGhpcyhiYWNrZW5kLCAiQmxvd2Zpc2giKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNpcGhlclN0b3JhZ2VQcm92aWRlcjwvY29kZT4gZm9yIHRoZSBnaXZlbiBiYWNrLWVuZAorICAgICAqIGFuZCBjaXBoZXIgYWxnb3JpdGhtLgorICAgICAqCisgICAgICogQHBhcmFtIGJhY2tlbmQKKyAgICAgKiAgICAgICAgICAgIGJhY2stZW5kIHN0b3JhZ2Ugc3RyYXRlZ3kgdG8gZW5jcnlwdC4KKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgc3ltbWV0cmljIGJsb2NrIGNpcGhlciBhbGdvcml0aG0gc3VjaCBhcworICAgICAqICAgICAgICAgICAgIkJsb3dmaXNoIiwgIkFFUyIgb3IgIlJDMiIuCisgICAgICovCisgICAgcHVibGljIENpcGhlclN0b3JhZ2VQcm92aWRlcihTdG9yYWdlUHJvdmlkZXIgYmFja2VuZCwgU3RyaW5nIGFsZ29yaXRobSkgeworICAgICAgICBpZiAoYmFja2VuZCA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kOworICAgICAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CisgICAgICAgICAgICB0aGlzLmtleWdlbiA9IEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZShhbGdvcml0aG0pOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdG9yYWdlT3V0cHV0U3RyZWFtIGNyZWF0ZVN0b3JhZ2VPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTZWNyZXRLZXlTcGVjIHNrZXlTcGVjID0gZ2V0U2VjcmV0S2V5U3BlYygpOworCisgICAgICAgIHJldHVybiBuZXcgQ2lwaGVyU3RvcmFnZU91dHB1dFN0cmVhbShiYWNrZW5kCisgICAgICAgICAgICAgICAgLmNyZWF0ZVN0b3JhZ2VPdXRwdXRTdHJlYW0oKSwgYWxnb3JpdGhtLCBza2V5U3BlYyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZWNyZXRLZXlTcGVjIGdldFNlY3JldEtleVNwZWMoKSB7CisgICAgICAgIGJ5dGVbXSByYXcgPSBrZXlnZW4uZ2VuZXJhdGVLZXkoKS5nZXRFbmNvZGVkKCk7CisgICAgICAgIHJldHVybiBuZXcgU2VjcmV0S2V5U3BlYyhyYXcsIGFsZ29yaXRobSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ2lwaGVyU3RvcmFnZU91dHB1dFN0cmVhbSBleHRlbmRzCisgICAgICAgICAgICBTdG9yYWdlT3V0cHV0U3RyZWFtIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdG9yYWdlT3V0cHV0U3RyZWFtIHN0b3JhZ2VPdXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFsZ29yaXRobTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWNyZXRLZXlTcGVjIHNrZXlTcGVjOworICAgICAgICBwcml2YXRlIGZpbmFsIENpcGhlck91dHB1dFN0cmVhbSBjaXBoZXJPdXQ7CisKKyAgICAgICAgcHVibGljIENpcGhlclN0b3JhZ2VPdXRwdXRTdHJlYW0oU3RvcmFnZU91dHB1dFN0cmVhbSBvdXQsCisgICAgICAgICAgICAgICAgU3RyaW5nIGFsZ29yaXRobSwgU2VjcmV0S2V5U3BlYyBza2V5U3BlYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdG9yYWdlT3V0ID0gb3V0OworICAgICAgICAgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOworICAgICAgICAgICAgICAgIHRoaXMuc2tleVNwZWMgPSBza2V5U3BlYzsKKworICAgICAgICAgICAgICAgIENpcGhlciBjaXBoZXIgPSBDaXBoZXIuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgICAgICAgICBjaXBoZXIuaW5pdChDaXBoZXIuRU5DUllQVF9NT0RFLCBza2V5U3BlYyk7CisKKyAgICAgICAgICAgICAgICB0aGlzLmNpcGhlck91dCA9IG5ldyBDaXBoZXJPdXRwdXRTdHJlYW0ob3V0LCBjaXBoZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIG5ldyBJT0V4Y2VwdGlvbigpLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgY2lwaGVyT3V0LmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUwKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNpcGhlck91dC53cml0ZShidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RvcmFnZSB0b1N0b3JhZ2UwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIGNpcGhlck91dCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBiZWNhdXNlIHRvU3RvcmFnZSBjYWxscyBjbG9zZQorICAgICAgICAgICAgU3RvcmFnZSBlbmNyeXB0ZWQgPSBzdG9yYWdlT3V0LnRvU3RvcmFnZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJTdG9yYWdlKGVuY3J5cHRlZCwgYWxnb3JpdGhtLCBza2V5U3BlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDaXBoZXJTdG9yYWdlIGltcGxlbWVudHMgU3RvcmFnZSB7CisgICAgICAgIHByaXZhdGUgU3RvcmFnZSBlbmNyeXB0ZWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFsZ29yaXRobTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWNyZXRLZXlTcGVjIHNrZXlTcGVjOworCisgICAgICAgIHB1YmxpYyBDaXBoZXJTdG9yYWdlKFN0b3JhZ2UgZW5jcnlwdGVkLCBTdHJpbmcgYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgIFNlY3JldEtleVNwZWMgc2tleVNwZWMpIHsKKyAgICAgICAgICAgIHRoaXMuZW5jcnlwdGVkID0gZW5jcnlwdGVkOworICAgICAgICAgICAgdGhpcy5hbGdvcml0aG0gPSBhbGdvcml0aG07CisgICAgICAgICAgICB0aGlzLnNrZXlTcGVjID0gc2tleVNwZWM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7CisgICAgICAgICAgICBpZiAoZW5jcnlwdGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBlbmNyeXB0ZWQuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgZW5jcnlwdGVkID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoZW5jcnlwdGVkID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3RvcmFnZSBoYXMgYmVlbiBkZWxldGVkIik7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2lwaGVyIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShhbGdvcml0aG0pOworICAgICAgICAgICAgICAgIGNpcGhlci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIHNrZXlTcGVjKTsKKworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluID0gZW5jcnlwdGVkLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaXBoZXJJbnB1dFN0cmVhbShpbiwgY2lwaGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBuZXcgSU9FeGNlcHRpb24oKS5pbml0Q2F1c2UoZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9EZWZhdWx0U3RvcmFnZVByb3ZpZGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjFjODEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKKworLyoqCisgKiBBbGxvd3MgZm9yIGEgZGVmYXVsdCB7QGxpbmsgU3RvcmFnZVByb3ZpZGVyfSBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkIG9uIGFuCisgKiBhcHBsaWNhdGlvbiBsZXZlbC4KKyAqIDxwPgorICogVGhlIGRlZmF1bHQgaW5zdGFuY2UgY2FuIGJlIHNldCBieSBlaXRoZXIgY2FsbGluZworICoge0BsaW5rICNzZXRJbnN0YW5jZShTdG9yYWdlUHJvdmlkZXIpfSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMgdXAgb3IgYnkKKyAqIHNldHRpbmcgdGhlIHN5c3RlbSBwcm9wZXJ0eQorICogPGNvZGU+b3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVmYXVsdFN0b3JhZ2VQcm92aWRlcjwvY29kZT4gdG8gdGhlIGNsYXNzCisgKiBuYW1lIG9mIGEgPGNvZGU+U3RvcmFnZVByb3ZpZGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbi4KKyAqIDxwPgorICogSWYgbmVpdGhlciBvcHRpb24gaXMgdXNlZCBvciBpZiB0aGUgY2xhc3MgaW5zdGFudGlhdGlvbiBmYWlscyB0aGlzIGNsYXNzCisgKiBwcm92aWRlcyBhIHByZS1jb25maWd1cmVkIGRlZmF1bHQgaW5zdGFuY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0U3RvcmFnZVByb3ZpZGVyIHsKKworICAgIC8qKiBWYWx1ZSBpcyA8Y29kZT5vcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZWZhdWx0U3RvcmFnZVByb3ZpZGVyPC9jb2RlPiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1RPUkFHRV9QUk9WSURFUl9QUk9QRVJUWSA9CisgICAgICAgICJvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZWZhdWx0U3RvcmFnZVByb3ZpZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhEZWZhdWx0U3RvcmFnZVByb3ZpZGVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFN0b3JhZ2VQcm92aWRlciBpbnN0YW5jZSA9IG51bGw7CisKKyAgICBzdGF0aWMgeworICAgICAgICBpbml0aWFsaXplKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBEZWZhdWx0U3RvcmFnZVByb3ZpZGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQge0BsaW5rIFN0b3JhZ2VQcm92aWRlcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHtAbGluayBTdG9yYWdlUHJvdmlkZXJ9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RvcmFnZVByb3ZpZGVyIGdldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVmYXVsdCB7QGxpbmsgU3RvcmFnZVByb3ZpZGVyfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZQorICAgICAqICAgICAgICAgICAgdGhlIGRlZmF1bHQge0BsaW5rIFN0b3JhZ2VQcm92aWRlcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEluc3RhbmNlKFN0b3JhZ2VQcm92aWRlciBpbnN0YW5jZSkgeworICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5pbnN0YW5jZSA9IGluc3RhbmNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgU3RyaW5nIGNsYXp6ID0gU3lzdGVtLmdldFByb3BlcnR5KERFRkFVTFRfU1RPUkFHRV9QUk9WSURFUl9QUk9QRVJUWSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluc3RhbmNlID0gKFN0b3JhZ2VQcm92aWRlcikgQ2xhc3MuZm9yTmFtZShjbGF6eikubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy53YXJuKCJVbmFibGUgdG8gY3JlYXRlIG9yIGluc3RhbnRpYXRlIFN0b3JhZ2VQcm92aWRlciBjbGFzcyAnIgorICAgICAgICAgICAgICAgICAgICArIGNsYXp6ICsgIicuIFVzaW5nIGRlZmF1bHQgaW5zdGVhZC4iLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICBTdG9yYWdlUHJvdmlkZXIgYmFja2VuZCA9IG5ldyBUZW1wRmlsZVN0b3JhZ2VQcm92aWRlcigpOworICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgVGhyZXNob2xkU3RvcmFnZVByb3ZpZGVyKGJhY2tlbmQsIDEwMjQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZm9yIHVuaXQgdGVzdHMgb25seQorICAgIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBpbnN0YW5jZSA9IG51bGw7CisgICAgICAgIGluaXRpYWxpemUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9NZW1vcnlTdG9yYWdlUHJvdmlkZXIuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9NZW1vcnlTdG9yYWdlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTNlNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL01lbW9yeVN0b3JhZ2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5CeXRlQXJyYXlCdWZmZXI7CisKKy8qKgorICogQSB7QGxpbmsgU3RvcmFnZVByb3ZpZGVyfSB0aGF0IHN0b3JlcyB0aGUgZGF0YSBlbnRpcmVseSBpbiBtZW1vcnkuCisgKiA8cD4KKyAqIEV4YW1wbGUgdXNhZ2U6CisgKgorICogPHByZT4KKyAqIFN0b3JhZ2VQcm92aWRlciBwcm92aWRlciA9IG5ldyBNZW1vcnlTdG9yYWdlUHJvdmlkZXIoKTsKKyAqIERlZmF1bHRTdG9yYWdlUHJvdmlkZXIuc2V0SW5zdGFuY2UocHJvdmlkZXIpOworICogPC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBNZW1vcnlTdG9yYWdlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFN0b3JhZ2VQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1lbW9yeVN0b3JhZ2VQcm92aWRlcjwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIE1lbW9yeVN0b3JhZ2VQcm92aWRlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmFnZU91dHB1dFN0cmVhbSBjcmVhdGVTdG9yYWdlT3V0cHV0U3RyZWFtKCkgeworICAgICAgICByZXR1cm4gbmV3IE1lbW9yeVN0b3JhZ2VPdXRwdXRTdHJlYW0oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNZW1vcnlTdG9yYWdlT3V0cHV0U3RyZWFtIGV4dGVuZHMKKyAgICAgICAgICAgIFN0b3JhZ2VPdXRwdXRTdHJlYW0geworICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYmFiID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigxMDI0KTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUwKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJhYi5hcHBlbmQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFN0b3JhZ2UgdG9TdG9yYWdlMCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1lbW9yeVN0b3JhZ2UoYmFiLmJ1ZmZlcigpLCBiYWIubGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE1lbW9yeVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlIHsKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY291bnQ7CisKKyAgICAgICAgcHVibGljIE1lbW9yeVN0b3JhZ2UoYnl0ZVtdIGRhdGEsIGludCBjb3VudCkgeworICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInN0b3JhZ2UgaGFzIGJlZW4gZGVsZXRlZCIpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEsIDAsIGNvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKKyAgICAgICAgICAgIGRhdGEgPSBudWxsOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvTXVsdGlSZWZlcmVuY2VTdG9yYWdlLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvTXVsdGlSZWZlcmVuY2VTdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIzOWRmYgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9NdWx0aVJlZmVyZW5jZVN0b3JhZ2UuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIDxwPgorICogQSB3cmFwcGVyIGFyb3VuZCBhbm90aGVyIHtAbGluayBTdG9yYWdlfSB0aGF0IGFsc28gbWFpbnRhaW5zIGEgcmVmZXJlbmNlCisgKiBjb3VudGVyLiBUaGUgaW5uZXIgc3RvcmFnZSBnZXRzIGRlbGV0ZWQgb25seSBpZiB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgcmVhY2hlcworICogemVyby4KKyAqIDwvcD4KKyAqIDxwPgorICogUmVmZXJlbmNlIGNvdW50aW5nIGlzIHVzZWQgdG8gZGVsZXRlIHRoZSBzdG9yYWdlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqIFNvLCBhbnkgdXNlcnMgb2YgdGhpcyBjbGFzcyBzaG91bGQgbm90ZToKKyAqIDwvcD4KKyAqIDx1bD4KKyAqIDxsaT5UaGUgcmVmZXJlbmNlIGNvdW50IGlzIHNldCB1cCBvbmUgb24gY29uc3RydWN0aW9uLiBJbiBhbGwgb3RoZXIgY2FzZXMsCisgKiB7QGxpbmsgI2FkZFJlZmVyZW5jZSgpfSBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHN0b3JhZ2UgaXMgc2hhcmVkLjwvbGk+CisgKiA8bGk+VGhlIGNhbGxlciBvZiB7QGxpbmsgI2FkZFJlZmVyZW5jZSgpfSBzaG91bGQgZW5zdXJlIHRoYXQKKyAqIHtAbGluayAjZGVsZXRlKCl9IGlzIGNhbGxlZCBvbmNlIGFuZCBvbmx5IG9uY2UuPC9saT4KKyAqIDxsaT5TaGFyaW5nIHRoZSB7QGxpbmsgU3RvcmFnZX0gaW5zdGFuY2UgcGFzc2VkIGludG8KKyAqIHtAbGluayAjTXVsdGlSZWZlcmVuY2VTdG9yYWdlKFN0b3JhZ2UpfSBtYXkgbGVhZCB0byBtaXNjb3VudGluZyBhbmQgcHJlbWF0dXJlCisgKiBkZWxldGlvbjwvbGk+CisgKiA8L3VsPgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlSZWZlcmVuY2VTdG9yYWdlIGltcGxlbWVudHMgU3RvcmFnZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0b3JhZ2Ugc3RvcmFnZTsKKyAgICBwcml2YXRlIGludCByZWZlcmVuY2VDb3VudGVyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NdWx0aVJlZmVyZW5jZVN0b3JhZ2U8L2NvZGU+IGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4KKyAgICAgKiBiYWNrLWVuZC4gVGhlIHJlZmVyZW5jZSBjb3VudGVyIGlzIGluaXRpYWxseSBzZXQgdG8gb25lIHNvIHRoZSBjYWxsZXIKKyAgICAgKiBkb2VzIG5vdCBoYXZlIHRvIGNhbGwge0BsaW5rICNhZGRSZWZlcmVuY2UoKX0gYWZ0ZXIgdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdG9yYWdlCisgICAgICogICAgICAgICAgICBzdG9yYWdlIGJhY2stZW5kIHRoYXQgc2hvdWxkIGJlIHJlZmVyZW5jZSBjb3VudGVkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgd2hlbiBzdG9yYWdlIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlSZWZlcmVuY2VTdG9yYWdlKFN0b3JhZ2Ugc3RvcmFnZSkgeworICAgICAgICBpZiAoc3RvcmFnZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCisgICAgICAgIHRoaXMuc3RvcmFnZSA9IHN0b3JhZ2U7CisgICAgICAgIHRoaXMucmVmZXJlbmNlQ291bnRlciA9IDE7IC8vIGNhbGxlciBob2xkcyBmaXJzdCByZWZlcmVuY2UKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnRlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGlzIHplcm8gd2hpY2ggaW1wbGllcyB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgIGJhY2tpbmcgc3RvcmFnZSBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKCkgeworICAgICAgICBpbmNyZW1lbnRDb3VudGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgYW5kIGRlbGV0ZXMgdGhlIGlubmVyCisgICAgICogPGNvZGU+U3RvcmFnZTwvY29kZT4gb2JqZWN0IGlmIHRoZSByZWZlcmVuY2UgY291bnRlciByZWFjaGVzIHplcm8uCisgICAgICogPHA+CisgICAgICogQSBjbGllbnQgdGhhdCBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCBtdXN0IG1ha2Ugc3VyZSBub3QgdG8KKyAgICAgKiBpbnZva2UgdGhpcyBtZXRob2QgYSBzZWNvbmQgdGltZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgdGhlIHJlZmVyZW5jZSBjb3VudGVyIGlzIHplcm8gd2hpY2ggaW1wbGllcyB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgIGJhY2tpbmcgc3RvcmFnZSBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVsZXRlKCkgeworICAgICAgICBpZiAoZGVjcmVtZW50Q291bnRlcigpKSB7CisgICAgICAgICAgICBzdG9yYWdlLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5wdXQgc3RyZWFtIG9mIHRoZSBpbm5lciA8Y29kZT5TdG9yYWdlPC9jb2RlPiBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGlucHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3RvcmFnZS5nZXRJbnB1dFN0cmVhbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplZCBpbmNyZW1lbnQgb2YgcmVmZXJlbmNlIGNvdW50LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICB3aGVuIGNvdW50ZXIgaXMgYWxyZWFkeSB6ZXJvCisgICAgICovCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbmNyZW1lbnRDb3VudGVyKCkgeworICAgICAgICBpZiAocmVmZXJlbmNlQ291bnRlciA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3RvcmFnZSBoYXMgYmVlbiBkZWxldGVkIik7CisKKyAgICAgICAgcmVmZXJlbmNlQ291bnRlcisrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXplZCBkZWNyZW1lbnQgb2YgcmVmZXJlbmNlIGNvdW50LgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIHdoZW4gY291bnRlciBoYXMgcmVhY2hlZCB6ZXJvLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIHdoZW4gY291bnRlciBpcyBhbHJlYWR5IHplcm8KKyAgICAgKi8KKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGRlY3JlbWVudENvdW50ZXIoKSB7CisgICAgICAgIGlmIChyZWZlcmVuY2VDb3VudGVyID09IDApCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzdG9yYWdlIGhhcyBiZWVuIGRlbGV0ZWQiKTsKKworICAgICAgICByZXR1cm4gLS1yZWZlcmVuY2VDb3VudGVyID09IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL1N0b3JhZ2UuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9TdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3OWQwMQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9TdG9yYWdlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zdG9yYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIENhbiBiZSB1c2VkIHRvIHJlYWQgZGF0YSB0aGF0IGhhcyBiZWVuIHN0b3JlZCBieSBhIHtAbGluayBTdG9yYWdlUHJvdmlkZXJ9LgorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0b3JhZ2UgeworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgc3RvcmVkCisgICAgICogZGF0YS4gVGhlIGlucHV0IHN0cmVhbSBzaG91bGQgYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIgd2hlbiBpdCBpcyBubworICAgICAqIGxvbmdlciBuZWVkZWQuCisgICAgICogPHA+CisgICAgICogTm90ZTogVGhlIHN0cmVhbSBzaG91bGQgTk9UIGJlIHdyYXBwZWQgaW4gYQorICAgICAqIDxjb2RlPkJ1ZmZlcmVkSW5wdXRTdHJlYW08L2NvZGU+IGJ5IHRoZSBjYWxsZXIuIElmIHRoZSBpbXBsZW1lbnRpbmcKKyAgICAgKiA8Y29kZT5TdG9yYWdlPC9jb2RlPiBjcmVhdGVzIGEgc3RyZWFtIHdoaWNoIHdvdWxkIGJlbmVmaXQgZnJvbSBiZWluZworICAgICAqIGJ1ZmZlcmVkIGl0IGlzIHRoZSA8Y29kZT5TdG9yYWdlPC9jb2RlPidzIHJlc3BvbnNpYmlsaXR5IHRvIHdyYXAgaXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBmb3IgcmVhZGluZyB0aGUgc3RvcmVkIGRhdGEuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIDxjb2RlPlN0b3JhZ2U8L2NvZGU+IGluc3RhbmNlIGhhcyBiZWVuIGRlbGV0ZWQuCisgICAgICovCisgICAgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIHRoZSBkYXRhIGhlbGQgYnkgdGhpcyA8Y29kZT5TdG9yYWdlPC9jb2RlPiBhcyBzb29uIGFzIHBvc3NpYmxlLgorICAgICAqIERlbGV0aW5nIGFuIGFscmVhZHkgZGVsZXRlZCA8Y29kZT5TdG9yYWdlPC9jb2RlPiBoYXMgbm8gZWZmZWN0LgorICAgICAqLworICAgIHZvaWQgZGVsZXRlKCk7CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9TdG9yYWdlT3V0cHV0U3RyZWFtLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvU3RvcmFnZU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMTA0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvU3RvcmFnZU91dHB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbiBvdXRwdXQgc3RyZWFtIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEKKyAqIHtAbGluayBTdG9yYWdlfSBvYmplY3QuIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgb2J0YWluZWQgYnkgY2FsbGluZworICoge0BsaW5rIFN0b3JhZ2VQcm92aWRlciNjcmVhdGVTdG9yYWdlT3V0cHV0U3RyZWFtKCl9LiBUaGUgdXNlciBjYW4gdGhlbiB3cml0ZQorICogZGF0YSB0byB0aGlzIGluc3RhbmNlIGFuZCBpbnZva2Uge0BsaW5rICN0b1N0b3JhZ2UoKX0gdG8gcmV0cmlldmUgYQorICoge0BsaW5rIFN0b3JhZ2V9IG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRoYXQgaGFzIGJlZW4gd3JpdHRlbi4KKyAqIDxwPgorICogTm90ZSB0aGF0IHRoZSA8Y29kZT5TdG9yYWdlT3V0cHV0U3RyZWFtPC9jb2RlPiBkb2VzIG5vdCBoYXZlIHRvIGJlIGNsb3NlZAorICogZXhwbGljaXRseSBiZWNhdXNlIHtAbGluayAjdG9TdG9yYWdlKCl9IGludm9rZXMge0BsaW5rICNjbG9zZSgpfSBpZgorICogbmVjZXNzYXJ5LiBBbHNvIG5vdGUgdGhhdCB7QGxpbmsgI3RvU3RvcmFnZSgpfSBtYXkgYmUgaW52b2tlZCBvbmx5IG9uY2UuIE9uZQorICogPGNvZGU+U3RvcmFnZU91dHB1dFN0cmVhbTwvY29kZT4gY2FuIGNyZWF0ZSBvbmx5IG9uZSA8Y29kZT5TdG9yYWdlPC9jb2RlPgorICogaW5zdGFuY2UuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdG9yYWdlT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgYnl0ZVtdIHNpbmdsZUJ5dGU7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZDsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlZFVwOworCisgICAgLyoqCisgICAgICogU29sZSBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RvcmFnZU91dHB1dFN0cmVhbSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhpcyBvdXRwdXQgc3RyZWFtIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGNsb3NlZCBhbmQgcmV0dXJucyBhCisgICAgICoge0BsaW5rIFN0b3JhZ2V9IG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiB0bworICAgICAqIHRoaXMgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IG5vdCBiZSBpbnZva2VkIGEgc2Vjb25kIHRpbWUuIFRoaXMgaXMgYmVjYXVzZQorICAgICAqIGZvciBzb21lIGltcGxlbWVudGF0aW9ucyBpdCBpcyBub3QgcG9zc2libGUgdG8gY3JlYXRlIGFub3RoZXIKKyAgICAgKiA8Y29kZT5TdG9yYWdlPC9jb2RlPiBvYmplY3QgdGhhdCBjYW4gYmUgcmVhZCBmcm9tIGFuZCBkZWxldGVkCisgICAgICogaW5kZXBlbmRlbnRseSAoZS5nLiBpZiB0aGUgaW1wbGVtZW50YXRpb24gd3JpdGVzIHRvIGEgZmlsZSkuCisgICAgICogCisgICAgICogQHJldHVybiBhIDxjb2RlPlN0b3JhZ2U8L2NvZGU+IG9iamVjdCBhcyBkZXNjcmliZWQgYWJvdmUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIG1ldGhvZCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RvcmFnZSB0b1N0b3JhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodXNlZFVwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInRvU3RvcmFnZSBtYXkgYmUgaW52b2tlZCBvbmx5IG9uY2UiKTsKKworICAgICAgICBpZiAoIWNsb3NlZCkKKyAgICAgICAgICAgIGNsb3NlKCk7CisKKyAgICAgICAgdXNlZFVwID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRvU3RvcmFnZTAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RvcmFnZU91dHB1dFN0cmVhbSBoYXMgYmVlbiBjbG9zZWQiKTsKKworICAgICAgICBpZiAoc2luZ2xlQnl0ZSA9PSBudWxsKQorICAgICAgICAgICAgc2luZ2xlQnl0ZSA9IG5ldyBieXRlWzFdOworCisgICAgICAgIHNpbmdsZUJ5dGVbMF0gPSAoYnl0ZSkgYjsKKyAgICAgICAgd3JpdGUwKHNpbmdsZUJ5dGUsIDAsIDEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0b3JhZ2VPdXRwdXRTdHJlYW0gaGFzIGJlZW4gY2xvc2VkIik7CisKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB3cml0ZTAoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsb3NlZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RvcmFnZU91dHB1dFN0cmVhbSBoYXMgYmVlbiBjbG9zZWQiKTsKKworICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKworICAgICAgICBpZiAob2Zmc2V0IDwgMCB8fCBsZW5ndGggPCAwIHx8IG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworCisgICAgICAgIGlmIChsZW5ndGggPT0gMCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB3cml0ZTAoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoaXMgb3V0cHV0IHN0cmVhbS4gU3ViY2xhc3NlcyB0aGF0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGhhdmUgdG8KKyAgICAgKiBpbnZva2UgPGNvZGU+c3VwZXIuY2xvc2UoKTwvY29kZT4uCisgICAgICogPHA+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBuZXZlciB0aHJvd3MgYW4ge0BsaW5rIElPRXhjZXB0aW9ufSBidXQgYSBzdWJjbGFzcworICAgICAqIG1pZ2h0LgorICAgICAqIAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYXMgdG8gaW1wbGVtZW50ZWQgYnkgYSBjb25jcmV0ZSBzdWJjbGFzcyB0byB3cml0ZSBieXRlcyBmcm9tIHRoZSBnaXZlbgorICAgICAqIGJ5dGUgYXJyYXkgdG8gdGhpcyA8Y29kZT5TdG9yYWdlT3V0cHV0U3RyZWFtPC9jb2RlPi4gVGhpcyBtZXRob2QgZ2V0cworICAgICAqIGNhbGxlZCBieSB7QGxpbmsgI3dyaXRlKGludCl9LCB7QGxpbmsgI3dyaXRlKGJ5dGVbXSl9IGFuZAorICAgICAqIHtAbGluayAjd3JpdGUoYnl0ZVtdLCBpbnQsIGludCl9LiBBbGwgdGhlIHJlcXVpcmVkIHByZWNvbmRpdGlvbnMgaGF2ZQorICAgICAqIGFscmVhZHkgYmVlbiBjaGVja2VkIGJ5IHRoZXNlIG1ldGhvZHMsIGluY2x1ZGluZyB0aGUgY2hlY2sgaWYgdGhlIG91dHB1dAorICAgICAqIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnVmZmVyCisgICAgICogICAgICAgICAgICBidWZmZXIgY29udGFpbmluZyBieXRlcyB0byB3cml0ZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICBzdGFydCBvZmZzZXQgaW4gdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGUwKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBIYXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBjb25jcmV0ZSBzdWJjbGFzcyB0byBjcmVhdGUgYSB7QGxpbmsgU3RvcmFnZX0KKyAgICAgKiBvYmplY3QgZnJvbSB0aGUgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGlzCisgICAgICogPGNvZGU+U3RvcmFnZU91dHB1dFN0cmVhbTwvY29kZT4uIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIGJ5CisgICAgICoge0BsaW5rICN0b1N0b3JhZ2UoKX0gYWZ0ZXIgdGhlIHByZWNvbmRpdGlvbnMgaGF2ZSBiZWVuIGNoZWNrZWQuIFRoZQorICAgICAqIGltcGxlbWVudGF0aW9uIGNhbiBhbHNvIGJlIHN1cmUgdGhhdCB0aGlzIG1ldGhvZHMgZ2V0cyBpbnZva2VkIG9ubHkgb25jZS4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RvcmFnZTwvY29kZT4gb2JqZWN0IGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RvcmFnZSB0b1N0b3JhZ2UwKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvU3RvcmFnZVByb3ZpZGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvU3RvcmFnZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2Yzg5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9TdG9yYWdlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKKy8qKgorICogUHJvdmlkZXMgYSBzdHJhdGVneSBmb3Igc3RvcmluZyB0aGUgY29udGVudHMgb2YgYW4gPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+CisgKiBvciByZXRyaWV2aW5nIHRoZSBjb250ZW50IHdyaXR0ZW4gdG8gYW4gPGNvZGU+T3V0cHV0U3RyZWFtPC9jb2RlPi4KKyAqLworcHVibGljIGludGVyZmFjZSBTdG9yYWdlUHJvdmlkZXIgeworICAgIC8qKgorICAgICAqIFN0b3JlcyB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBzdHJlYW0gY29udGFpbmluZyB0aGUgZGF0YSB0byBzdG9yZS4KKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0b3JhZ2V9IGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlCisgICAgICogICAgICAgICBzdG9yZWQgY29udGVudC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgU3RvcmFnZSBzdG9yZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBTdG9yYWdlT3V0cHV0U3RyZWFtfSB3aGVyZSBkYXRhIHRvIGJlIHN0b3JlZCBjYW4gYmUKKyAgICAgKiB3cml0dGVuIHRvLiBTdWJzZXF1ZW50bHkgdGhlIHVzZXIgY2FuIGNhbGwKKyAgICAgKiB7QGxpbmsgU3RvcmFnZU91dHB1dFN0cmVhbSN0b1N0b3JhZ2UoKSB0b1N0b3JhZ2UoKX0gb24gdGhhdCBvYmplY3QgdG8gZ2V0CisgICAgICogYSB7QGxpbmsgU3RvcmFnZX0gaW5zdGFuY2UgdGhhdCBob2xkcyB0aGUgZGF0YSB0aGF0IGhhcyBiZWVuIHdyaXR0ZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0b3JhZ2VPdXRwdXRTdHJlYW19IHdoZXJlIGRhdGEgY2FuIGJlIHdyaXR0ZW4gdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgU3RvcmFnZU91dHB1dFN0cmVhbSBjcmVhdGVTdG9yYWdlT3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL1RlbXBGaWxlU3RvcmFnZVByb3ZpZGVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvVGVtcEZpbGVTdG9yYWdlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMwYWNiCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL1RlbXBGaWxlU3RvcmFnZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHtAbGluayBTdG9yYWdlUHJvdmlkZXJ9IHRoYXQgc3RvcmVzIHRoZSBkYXRhIGluIHRlbXBvcmFyeSBmaWxlcy4gVGhlIGZpbGVzCisgKiBhcmUgc3RvcmVkIGVpdGhlciBpbiBhIHVzZXItc3BlY2lmaWVkIGRpcmVjdG9yeSBvciB0aGUgZGVmYXVsdCB0ZW1wb3JhcnktZmlsZQorICogZGlyZWN0b3J5IChzcGVjaWZpZWQgYnkgc3lzdGVtIHByb3BlcnR5IDxjb2RlPmphdmEuaW8udG1wZGlyPC9jb2RlPikuCisgKiA8cD4KKyAqIEV4YW1wbGUgdXNhZ2U6CisgKgorICogPHByZT4KKyAqIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoJnF1b3Q7L3RtcC9taW1lNGomcXVvdDspOworICogU3RvcmFnZVByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFRlbXBGaWxlU3RvcmFnZVByb3ZpZGVyKGRpcmVjdG9yeSk7CisgKiBEZWZhdWx0U3RvcmFnZVByb3ZpZGVyLnNldEluc3RhbmNlKHByb3ZpZGVyKTsKKyAqIDwvcHJlPgorICovCitwdWJsaWMgY2xhc3MgVGVtcEZpbGVTdG9yYWdlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFN0b3JhZ2VQcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QUkVGSVggPSAibTRqIjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdWZmaXg7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGRpcmVjdG9yeTsKKworICAgIC8qKgorICAgICAqIEVxdWl2YWxlbnQgdG8gdXNpbmcgY29uc3RydWN0b3IKKyAgICAgKiA8Y29kZT5UZW1wRmlsZVN0b3JhZ2VQcm92aWRlcigibTRqIiwgbnVsbCwgbnVsbCk8L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBUZW1wRmlsZVN0b3JhZ2VQcm92aWRlcigpIHsKKyAgICAgICAgdGhpcyhERUZBVUxUX1BSRUZJWCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXF1aXZhbGVudCB0byB1c2luZyBjb25zdHJ1Y3RvcgorICAgICAqIDxjb2RlPlRlbXBGaWxlU3RvcmFnZVByb3ZpZGVyKCJtNGoiLCBudWxsLCBkaXJlY3RvcnkpPC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVtcEZpbGVTdG9yYWdlUHJvdmlkZXIoRmlsZSBkaXJlY3RvcnkpIHsKKyAgICAgICAgdGhpcyhERUZBVUxUX1BSRUZJWCwgbnVsbCwgZGlyZWN0b3J5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRlbXBGaWxlU3RvcmFnZVByb3ZpZGVyPC9jb2RlPiB1c2luZyB0aGUgZ2l2ZW4KKyAgICAgKiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4CisgICAgICogICAgICAgICAgICBwcmVmaXggZm9yIGdlbmVyYXRpbmcgdGhlIHRlbXBvcmFyeSBmaWxlJ3MgbmFtZTsgbXVzdCBiZSBhdAorICAgICAqICAgICAgICAgICAgbGVhc3QgdGhyZWUgY2hhcmFjdGVycyBsb25nLgorICAgICAqIEBwYXJhbSBzdWZmaXgKKyAgICAgKiAgICAgICAgICAgIHN1ZmZpeCBmb3IgZ2VuZXJhdGluZyB0aGUgdGVtcG9yYXJ5IGZpbGUncyBuYW1lOyBtYXkgYmUKKyAgICAgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgc3VmZml4IDxjb2RlPiIudG1wIjwvY29kZT4uCisgICAgICogQHBhcmFtIGRpcmVjdG9yeQorICAgICAqICAgICAgICAgICAgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgZmlsZSBpcyB0byBiZSBjcmVhdGVkLCBvcgorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRlZmF1bHQgdGVtcG9yYXJ5LWZpbGUgZGlyZWN0b3J5IGlzCisgICAgICogICAgICAgICAgICB0byBiZSB1c2VkIChzcGVjaWZpZWQgYnkgdGhlIHN5c3RlbSBwcm9wZXJ0eQorICAgICAqICAgICAgICAgICAgPGNvZGU+amF2YS5pby50bXBkaXI8L2NvZGU+KS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBnaXZlbiBwcmVmaXggaXMgbGVzcyB0aGFuIHRocmVlIGNoYXJhY3RlcnMgbG9uZyBvciB0aGUKKyAgICAgKiAgICAgICAgICAgICBnaXZlbiBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSBjcmVhdGVkIChpZiBpdAorICAgICAqICAgICAgICAgICAgIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPikuCisgICAgICovCisgICAgcHVibGljIFRlbXBGaWxlU3RvcmFnZVByb3ZpZGVyKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgsIEZpbGUgZGlyZWN0b3J5KSB7CisgICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPCAzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBwcmVmaXgiKTsKKworICAgICAgICBpZiAoZGlyZWN0b3J5ICE9IG51bGwgJiYgIWRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpCisgICAgICAgICAgICAgICAgJiYgIWRpcmVjdG9yeS5ta2RpcnMoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgZGlyZWN0b3J5Iik7CisKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgIHRoaXMuc3VmZml4ID0gc3VmZml4OworICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RvcmFnZU91dHB1dFN0cmVhbSBjcmVhdGVTdG9yYWdlT3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShwcmVmaXgsIHN1ZmZpeCwgZGlyZWN0b3J5KTsKKyAgICAgICAgZmlsZS5kZWxldGVPbkV4aXQoKTsKKworICAgICAgICByZXR1cm4gbmV3IFRlbXBGaWxlU3RvcmFnZU91dHB1dFN0cmVhbShmaWxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUZW1wRmlsZVN0b3JhZ2VPdXRwdXRTdHJlYW0gZXh0ZW5kcworICAgICAgICAgICAgU3RvcmFnZU91dHB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOworICAgICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7CisKKyAgICAgICAgcHVibGljIFRlbXBGaWxlU3RvcmFnZU91dHB1dFN0cmVhbShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICAgICAgdGhpcy5vdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGUwKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RvcmFnZSB0b1N0b3JhZ2UwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIG91dCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBiZWNhdXNlIHRvU3RvcmFnZSBjYWxscyBjbG9zZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUZW1wRmlsZVN0b3JhZ2UoZmlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUZW1wRmlsZVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlIHsKKworICAgICAgICBwcml2YXRlIEZpbGUgZmlsZTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8RmlsZT4gZmlsZXNUb0RlbGV0ZSA9IG5ldyBIYXNoU2V0PEZpbGU+KCk7CisKKyAgICAgICAgcHVibGljIFRlbXBGaWxlU3RvcmFnZShGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7CisgICAgICAgICAgICAvLyBkZWxldGluZyBhIGZpbGUgbWlnaHQgbm90IGltbWVkaWF0ZWx5IHN1Y2NlZWQgaWYgdGhlcmUgYXJlIHN0aWxsCisgICAgICAgICAgICAvLyBzdHJlYW1zIGxlZnQgb3BlbiAoZXNwZWNpYWxseSB1bmRlciBXaW5kb3dzKS4gc28gd2Uga2VlcCB0cmFjayBvZgorICAgICAgICAgICAgLy8gdGhlIGZpbGVzIHRoYXQgaGF2ZSB0byBiZSBkZWxldGVkIGFuZCB0cnkgdG8gZGVsZXRlIGFsbCB0aGVzZQorICAgICAgICAgICAgLy8gZmlsZXMgZWFjaCB0aW1lIHRoaXMgbWV0aG9kIGdldHMgaW52b2tlZC4KKworICAgICAgICAgICAgLy8gYSBiZXR0ZXIgYnV0IG1vcmUgY29tcGxpY2F0ZWQgc29sdXRpb24gd291bGQgYmUgdG8gc3RhcnQgYQorICAgICAgICAgICAgLy8gc2VwYXJhdGUgdGhyZWFkIHRoYXQgdHJpZXMgdG8gZGVsZXRlIHRoZSBmaWxlcyBwZXJpb2RpY2FsbHkuCisKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZmlsZXNUb0RlbGV0ZSkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZXNUb0RlbGV0ZS5hZGQoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RmlsZT4gaXRlcmF0b3IgPSBmaWxlc1RvRGVsZXRlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInN0b3JhZ2UgaGFzIGJlZW4gZGVsZXRlZCIpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL1RocmVzaG9sZFN0b3JhZ2VQcm92aWRlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL1RocmVzaG9sZFN0b3JhZ2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYWQ5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvVGhyZXNob2xkU3RvcmFnZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZUFycmF5QnVmZmVyOworCisvKioKKyAqIEEge0BsaW5rIFN0b3JhZ2VQcm92aWRlcn0gdGhhdCBrZWVwcyBzbWFsbCBhbW91bnRzIG9mIGRhdGEgaW4gbWVtb3J5IGFuZAorICogd3JpdGVzIHRoZSByZW1haW5kZXIgdG8gYW5vdGhlciA8Y29kZT5TdG9yYWdlUHJvdmlkZXI8L2NvZGU+ICh0aGUgYmFjay1lbmQpCisgKiBpZiBhIGNlcnRhaW4gdGhyZXNob2xkIHNpemUgZ2V0cyBleGNlZWRlZC4KKyAqIDxwPgorICogRXhhbXBsZSB1c2FnZToKKyAqCisgKiA8cHJlPgorICogU3RvcmFnZVByb3ZpZGVyIHRlbXBTdG9yZSA9IG5ldyBUZW1wRmlsZVN0b3JhZ2VQcm92aWRlcigpOworICogU3RvcmFnZVByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFRocmVzaG9sZFN0b3JhZ2VQcm92aWRlcih0ZW1wU3RvcmUsIDQwOTYpOworICogRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5zZXRJbnN0YW5jZShwcm92aWRlcik7CisgKiA8L3ByZT4KKyAqLworcHVibGljIGNsYXNzIFRocmVzaG9sZFN0b3JhZ2VQcm92aWRlciBleHRlbmRzIEFic3RyYWN0U3RvcmFnZVByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RvcmFnZVByb3ZpZGVyIGJhY2tlbmQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdGhyZXNob2xkU2l6ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGhyZXNob2xkU3RvcmFnZVByb3ZpZGVyPC9jb2RlPiBmb3IgdGhlIGdpdmVuCisgICAgICogYmFjay1lbmQgdXNpbmcgYSB0aHJlc2hvbGQgc2l6ZSBvZiAyMDQ4IGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBUaHJlc2hvbGRTdG9yYWdlUHJvdmlkZXIoU3RvcmFnZVByb3ZpZGVyIGJhY2tlbmQpIHsKKyAgICAgICAgdGhpcyhiYWNrZW5kLCAyMDQ4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRocmVzaG9sZFN0b3JhZ2VQcm92aWRlcjwvY29kZT4gZm9yIHRoZSBnaXZlbgorICAgICAqIGJhY2stZW5kIGFuZCB0aHJlc2hvbGQgc2l6ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYWNrZW5kCisgICAgICogICAgICAgICAgICB1c2VkIHRvIHN0b3JlIHRoZSByZW1haW5kZXIgb2YgdGhlIGRhdGEgaWYgdGhlIHRocmVzaG9sZCBzaXplCisgICAgICogICAgICAgICAgICBnZXRzIGV4Y2VlZGVkLgorICAgICAqIEBwYXJhbSB0aHJlc2hvbGRTaXplCisgICAgICogICAgICAgICAgICBkZXRlcm1pbmVzIGhvdyBtdWNoIGJ5dGVzIGFyZSBrZXB0IGluIG1lbW9yeSBiZWZvcmUgdGhhdAorICAgICAqICAgICAgICAgICAgYmFjay1lbmQgc3RvcmFnZSBwcm92aWRlciBpcyB1c2VkIHRvIHN0b3JlIHRoZSByZW1haW5kZXIgb2YKKyAgICAgKiAgICAgICAgICAgIHRoZSBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBUaHJlc2hvbGRTdG9yYWdlUHJvdmlkZXIoU3RvcmFnZVByb3ZpZGVyIGJhY2tlbmQsIGludCB0aHJlc2hvbGRTaXplKSB7CisgICAgICAgIGlmIChiYWNrZW5kID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIGlmICh0aHJlc2hvbGRTaXplIDwgMSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICB0aGlzLmJhY2tlbmQgPSBiYWNrZW5kOworICAgICAgICB0aGlzLnRocmVzaG9sZFNpemUgPSB0aHJlc2hvbGRTaXplOworICAgIH0KKworICAgIHB1YmxpYyBTdG9yYWdlT3V0cHV0U3RyZWFtIGNyZWF0ZVN0b3JhZ2VPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBuZXcgVGhyZXNob2xkU3RvcmFnZU91dHB1dFN0cmVhbSgpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgVGhyZXNob2xkU3RvcmFnZU91dHB1dFN0cmVhbSBleHRlbmRzCisgICAgICAgICAgICBTdG9yYWdlT3V0cHV0U3RyZWFtIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheUJ1ZmZlciBoZWFkOworICAgICAgICBwcml2YXRlIFN0b3JhZ2VPdXRwdXRTdHJlYW0gdGFpbDsKKworICAgICAgICBwdWJsaWMgVGhyZXNob2xkU3RvcmFnZU91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBidWZmZXJTaXplID0gTWF0aC5taW4odGhyZXNob2xkU2l6ZSwgMTAyNCk7CisgICAgICAgICAgICBoZWFkID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcihidWZmZXJTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworCisgICAgICAgICAgICBpZiAodGFpbCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHRhaWwuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZTAoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaW50IHJlbWFpbmluZ0hlYWRTaXplID0gdGhyZXNob2xkU2l6ZSAtIGhlYWQubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAocmVtYWluaW5nSGVhZFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IG4gPSBNYXRoLm1pbihyZW1haW5pbmdIZWFkU2l6ZSwgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBoZWFkLmFwcGVuZChidWZmZXIsIG9mZnNldCwgbik7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG47CisgICAgICAgICAgICAgICAgbGVuZ3RoIC09IG47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhaWwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGFpbCA9IGJhY2tlbmQuY3JlYXRlU3RvcmFnZU91dHB1dFN0cmVhbSgpOworCisgICAgICAgICAgICAgICAgdGFpbC53cml0ZShidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RvcmFnZSB0b1N0b3JhZ2UwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0YWlsID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZW1vcnlTdG9yYWdlUHJvdmlkZXIuTWVtb3J5U3RvcmFnZShoZWFkLmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZC5sZW5ndGgoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGhyZXNob2xkU3RvcmFnZShoZWFkLmJ1ZmZlcigpLCBoZWFkLmxlbmd0aCgpLCB0YWlsCisgICAgICAgICAgICAgICAgICAgIC50b1N0b3JhZ2UoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRocmVzaG9sZFN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlIHsKKworICAgICAgICBwcml2YXRlIGJ5dGVbXSBoZWFkOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBoZWFkTGVuOworICAgICAgICBwcml2YXRlIFN0b3JhZ2UgdGFpbDsKKworICAgICAgICBwdWJsaWMgVGhyZXNob2xkU3RvcmFnZShieXRlW10gaGVhZCwgaW50IGhlYWRMZW4sIFN0b3JhZ2UgdGFpbCkgeworICAgICAgICAgICAgdGhpcy5oZWFkID0gaGVhZDsKKyAgICAgICAgICAgIHRoaXMuaGVhZExlbiA9IGhlYWRMZW47CisgICAgICAgICAgICB0aGlzLnRhaWwgPSB0YWlsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlKCkgeworICAgICAgICAgICAgaWYgKGhlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhlYWQgPSBudWxsOworICAgICAgICAgICAgICAgIHRhaWwuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgdGFpbCA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGhlYWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzdG9yYWdlIGhhcyBiZWVuIGRlbGV0ZWQiKTsKKworICAgICAgICAgICAgSW5wdXRTdHJlYW0gaGVhZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShoZWFkLCAwLCBoZWFkTGVuKTsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHRhaWxTdHJlYW0gPSB0YWlsLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0oaGVhZFN0cmVhbSwgdGFpbFN0cmVhbSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovdXRpbC9CeXRlQXJyYXlCdWZmZXIuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovdXRpbC9CeXRlQXJyYXlCdWZmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjI1OTAwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL0J5dGVBcnJheUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWw7CisKKworLyoqCisgKiBBIHJlc2l6YWJsZSBieXRlIGFycmF5LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQnl0ZUFycmF5QnVmZmVyIGltcGxlbWVudHMgQnl0ZVNlcXVlbmNlIHsKKyAgICAKKyAgICBwcml2YXRlIGJ5dGVbXSBidWZmZXI7CisgICAgcHJpdmF0ZSBpbnQgbGVuOworCisgICAgcHVibGljIEJ5dGVBcnJheUJ1ZmZlcihpbnQgY2FwYWNpdHkpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgaWYgKGNhcGFjaXR5IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnVmZmVyIGNhcGFjaXR5IG1heSBub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBieXRlW2NhcGFjaXR5XTsgCisgICAgfQorCisgICAgcHVibGljIEJ5dGVBcnJheUJ1ZmZlcihieXRlW10gYnl0ZXMsIGJvb2xlYW4gZG9udENvcHkpIHsKKyAgICAgICAgdGhpcyhieXRlcywgYnl0ZXMubGVuZ3RoLCBkb250Q29weSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBCeXRlQXJyYXlCdWZmZXIoYnl0ZVtdIGJ5dGVzLCBpbnQgbGVuLCBib29sZWFuIGRvbnRDb3B5KSB7CisgICAgICAgIGlmIChieXRlcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICBpZiAobGVuIDwgMCB8fCBsZW4gPiBieXRlcy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKGRvbnRDb3B5KSB7CisgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ5dGVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgYnl0ZVtsZW5dOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgMCwgdGhpcy5idWZmZXIsIDAsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmxlbiA9IGxlbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwYW5kKGludCBuZXdsZW4pIHsKKyAgICAgICAgYnl0ZSBuZXdidWZmZXJbXSA9IG5ldyBieXRlW01hdGgubWF4KHRoaXMuYnVmZmVyLmxlbmd0aCA8PCAxLCBuZXdsZW4pXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0aGlzLmJ1ZmZlciwgMCwgbmV3YnVmZmVyLCAwLCB0aGlzLmxlbik7CisgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3YnVmZmVyOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoZmluYWwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgaWYgKGIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgob2ZmIDwgMCkgfHwgKG9mZiA+IGIubGVuZ3RoKSB8fCAobGVuIDwgMCkgfHwKKyAgICAgICAgICAgICAgICAoKG9mZiArIGxlbikgPCAwKSB8fCAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld2xlbiA9IHRoaXMubGVuICsgbGVuOworICAgICAgICBpZiAobmV3bGVuID4gdGhpcy5idWZmZXIubGVuZ3RoKSB7CisgICAgICAgICAgICBleHBhbmQobmV3bGVuKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZiwgdGhpcy5idWZmZXIsIHRoaXMubGVuLCBsZW4pOworICAgICAgICB0aGlzLmxlbiA9IG5ld2xlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmQoaW50IGIpIHsKKyAgICAgICAgaW50IG5ld2xlbiA9IHRoaXMubGVuICsgMTsKKyAgICAgICAgaWYgKG5ld2xlbiA+IHRoaXMuYnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgZXhwYW5kKG5ld2xlbik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5idWZmZXJbdGhpcy5sZW5dID0gKGJ5dGUpYjsKKyAgICAgICAgdGhpcy5sZW4gPSBuZXdsZW47CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIHRoaXMubGVuID0gMDsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKKyAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVt0aGlzLmxlbl07IAorICAgICAgICBpZiAodGhpcy5sZW4gPiAwKSB7CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuYnVmZmVyLCAwLCBiLCAwLCB0aGlzLmxlbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBieXRlIGJ5dGVBdChpbnQgaSkgeworICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLmxlbikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisKKyAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyW2ldOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGNhcGFjaXR5KCkgeworICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIubGVuZ3RoOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGxlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGVuOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gYnVmZmVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5idWZmZXI7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmRleE9mKGJ5dGUgYikgeworICAgICAgICByZXR1cm4gaW5kZXhPZihiLCAwLCB0aGlzLmxlbik7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmRleE9mKGJ5dGUgYiwgaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkgeworICAgICAgICBpZiAoYmVnaW5JbmRleCA8IDApIHsKKyAgICAgICAgICAgIGJlZ2luSW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChlbmRJbmRleCA+IHRoaXMubGVuKSB7CisgICAgICAgICAgICBlbmRJbmRleCA9IHRoaXMubGVuOworICAgICAgICB9CisgICAgICAgIGlmIChiZWdpbkluZGV4ID4gZW5kSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gYmVnaW5JbmRleDsgaSA8IGVuZEluZGV4OyBpKyspIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcltpXSA9PSBiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuKSB7CisgICAgICAgIGlmIChsZW4gPCAwIHx8IGxlbiA+IHRoaXMuYnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmxlbiA9IGxlbjsKKyAgICB9CisgICAgCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGVuID09IDA7IAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Z1bGwoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmxlbiA9PSB0aGlzLmJ1ZmZlci5sZW5ndGg7IAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHRvQnl0ZUFycmF5KCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL0J5dGVTZXF1ZW5jZS5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL0J5dGVTZXF1ZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Yzg5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvQnl0ZVNlcXVlbmNlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsOworCisvKioKKyAqIEFuIGltbXV0YWJsZSBzZXF1ZW5jZSBvZiBieXRlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBCeXRlU2VxdWVuY2UgeworCisgICAgLyoqCisgICAgICogQW4gZW1wdHkgYnl0ZSBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBCeXRlU2VxdWVuY2UgRU1QVFkgPSBuZXcgRW1wdHlCeXRlU2VxdWVuY2UoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIGJ5dGUgc2VxdWVuY2UuCisgICAgICogCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIDxjb2RlPmJ5dGU8L2NvZGU+cyBpbiB0aGlzIHNlcXVlbmNlLgorICAgICAqLworICAgIGludCBsZW5ndGgoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDxjb2RlPmJ5dGU8L2NvZGU+IHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIDxjb2RlPmJ5dGU8L2NvZGU+IHZhbHVlIHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+Ynl0ZTwvY29kZT4gdmFsdWUKKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5pbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKCk8L2NvZGU+LgorICAgICAqLworICAgIGJ5dGUgYnl0ZUF0KGludCBpbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnl0ZSBzZXF1ZW5jZSBpbnRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ5dGUKKyAgICAgKiBhcnJheSBhbmQgcmV0dXJucyB0aGF0IGFycmF5LgorICAgICAqIAorICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IGhvbGRpbmcgYSBjb3B5IG9mIHRoaXMgYnl0ZSBzZXF1ZW5jZS4KKyAgICAgKi8KKyAgICBieXRlW10gdG9CeXRlQXJyYXkoKTsKKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL0NoYXJzZXRVdGlsLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvQ2hhcnNldFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWVkN2JjCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL0NoYXJzZXRVdGlsLmphdmEKQEAgLTAsMCArMSwxMjcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsOw0KKw0KK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247DQoraW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7DQoraW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7DQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZ0ZhY3Rvcnk7DQorDQorLyoqDQorICogVXRpbGl0eSBjbGFzcyBmb3Igd29ya2luZyB3aXRoIGNoYXJhY3RlciBzZXRzLiBJdCBpcyBzb21ld2hhdCBzaW1pbGFyIHRvDQorICogdGhlIEphdmEgMS40IDxjb2RlPmphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDwvY29kZT4gY2xhc3MgYnV0IGtub3dzIG1hbnkNCisgKiBtb3JlIGFsaWFzZXMgYW5kIGlzIGNvbXBhdGlibGUgd2l0aCBKYXZhIDEuMy4gSXQgd2lsbCB1c2UgYSBzaW1wbGUgZGV0ZWN0aW9uDQorICogbWVjaGFuaXNtIHRvIGRldGVjdCB3aGF0IGNoYXJhY3RlciBzZXRzIHRoZSBjdXJyZW50IFZNIHN1cHBvcnRzLiBUaGlzIHdpbGwNCisgKiBiZSBhIHN1Yi1zZXQgb2YgdGhlIGNoYXJhY3RlciBzZXRzIGxpc3RlZCBpbiB0aGUNCisgKiA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj4NCisgKiBKYXZhIDEuNSAoSjJTRTUuMCkgU3VwcG9ydGVkIEVuY29kaW5nczwvYT4gZG9jdW1lbnQuDQorICogPHA+DQorICogVGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMiPg0KKyAqIElBTkEgQ2hhcmFjdGVyIFNldHM8L2E+IGRvY3VtZW50IGhhcyBiZWVuIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcmVmZXJyZWQNCisgKiBNSU1FIGNoYXJhY3RlciBzZXQgbmFtZXMgYW5kIHRvIGdldCBhIGxpc3Qgb2Yga25vd24gYWxpYXNlcy4NCisgKiA8cD4NCisgKiBUaGlzIGlzIGEgY29tcGxldGUgbGlzdCBvZiB0aGUgY2hhcmFjdGVyIHNldHMga25vd24gdG8gdGhpcyBjbGFzczoNCisgKiA8dGFibGU+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DYW5vbmljYWwgKEphdmEpIG5hbWU8L3RkPg0KKyAqICAgICAgICAgPHRkPk1JTUUgcHJlZmVycmVkPC90ZD4NCisgKiAgICAgICAgIDx0ZD5BbGlhc2VzPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkFTQ0lJPC90ZD4NCisgKiAgICAgICAgIDx0ZD5VUy1BU0NJSTwvdGQ+DQorICogICAgICAgICA8dGQ+QU5TSV9YMy40LTE5NjggaXNvLWlyLTYgQU5TSV9YMy40LTE5ODYgSVNPXzY0Ni5pcnY6MTk5MSBJU082NDYtVVMgdXMgSUJNMzY3IGNwMzY3IGNzQVNDSUkgYXNjaWk3IDY0NiBpc29fNjQ2LmlydjoxOTgzIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5CaWc1PC90ZD4NCisgKiAgICAgICAgIDx0ZD5CaWc1PC90ZD4NCisgKiAgICAgICAgIDx0ZD5jc0JpZzUgQ04tQmlnNSBCSUctRklWRSBCSUdGSVZFIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5CaWc1X0hLU0NTPC90ZD4NCisgKiAgICAgICAgIDx0ZD5CaWc1LUhLU0NTPC90ZD4NCisgKiAgICAgICAgIDx0ZD5iaWc1aGtzY3MgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkJpZzVfU29sYXJpczwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMDM3PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk0wMzc8L3RkPg0KKyAqICAgICAgICAgPHRkPmViY2RpYy1jcC11cyBlYmNkaWMtY3AtY2EgZWJjZGljLWNwLXd0IGViY2RpYy1jcC1ubCBjc0lCTTAzNyA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AxMDA2PC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AxMDI1PC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AxMDI2PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk0xMDI2PC90ZD4NCisgKiAgICAgICAgIDx0ZD5jc0lCTTEwMjYgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTA0NjwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTA0NzwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNMTA0NzwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNLTEwNDcgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTA5NzwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTA5ODwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTExMjwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTEyMjwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTEyMzwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTEyNDwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTE0MDwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNMDExNDA8L3RkPg0KKyAqICAgICAgICAgPHRkPkNDU0lEMDExNDAgQ1AwMTE0MCBlYmNkaWMtdXMtMzcrZXVybyA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AxMTQxPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk0wMTE0MTwvdGQ+DQorICogICAgICAgICA8dGQ+Q0NTSUQwMTE0MSBDUDAxMTQxIGViY2RpYy1kZS0yNzMrZXVybyA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AxMTQyPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk0wMTE0MjwvdGQ+DQorICogICAgICAgICA8dGQ+Q0NTSUQwMTE0MiBDUDAxMTQyIGViY2RpYy1kay0yNzcrZXVybyBlYmNkaWMtbm8tMjc3K2V1cm8gPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTE0MzwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNMDExNDM8L3RkPg0KKyAqICAgICAgICAgPHRkPkNDU0lEMDExNDMgQ1AwMTE0MyBlYmNkaWMtZmktMjc4K2V1cm8gZWJjZGljLXNlLTI3OCtldXJvIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDExNDQ8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTAxMTQ0PC90ZD4NCisgKiAgICAgICAgIDx0ZD5DQ1NJRDAxMTQ0IENQMDExNDQgZWJjZGljLWl0LTI4MCtldXJvIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDExNDU8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTAxMTQ1PC90ZD4NCisgKiAgICAgICAgIDx0ZD5DQ1NJRDAxMTQ1IENQMDExNDUgZWJjZGljLWVzLTI4NCtldXJvIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDExNDY8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTAxMTQ2PC90ZD4NCisgKiAgICAgICAgIDx0ZD5DQ1NJRDAxMTQ2IENQMDExNDYgZWJjZGljLWdiLTI4NStldXJvIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDExNDc8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTAxMTQ3PC90ZD4NCisgKiAgICAgICAgIDx0ZD5DQ1NJRDAxMTQ3IENQMDExNDcgZWJjZGljLWZyLTI5NytldXJvIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDExNDg8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTAxMTQ4PC90ZD4NCisgKiAgICAgICAgIDx0ZD5DQ1NJRDAxMTQ4IENQMDExNDggZWJjZGljLWludGVybmF0aW9uYWwtNTAwK2V1cm8gPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTE0OTwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNMDExNDk8L3RkPg0KKyAqICAgICAgICAgPHRkPkNDU0lEMDExNDkgQ1AwMTE0OSBlYmNkaWMtaXMtODcxK2V1cm8gPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTI1MDwvdGQ+DQorICogICAgICAgICA8dGQ+d2luZG93cy0xMjUwPC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AxMjUxPC90ZD4NCisgKiAgICAgICAgIDx0ZD53aW5kb3dzLTEyNTE8L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDEyNTI8L3RkPg0KKyAqICAgICAgICAgPHRkPndpbmRvd3MtMTI1MjwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTI1MzwvdGQ+DQorICogICAgICAgICA8dGQ+d2luZG93cy0xMjUzPC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AxMjU0PC90ZD4NCisgKiAgICAgICAgIDx0ZD53aW5kb3dzLTEyNTQ8L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDEyNTU8L3RkPg0KKyAqICAgICAgICAgPHRkPndpbmRvd3MtMTI1NTwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTI1NjwvdGQ+DQorICogICAgICAgICA8dGQ+d2luZG93cy0xMjU2PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AxMjU3PC90ZD4NCisgKiAgICAgICAgIDx0ZD53aW5kb3dzLTEyNTc8L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDEyNTg8L3RkPg0KKyAqICAgICAgICAgPHRkPndpbmRvd3MtMTI1ODwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTM4MTwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMTM4MzwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMjczPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk0yNzM8L3RkPg0KKyAqICAgICAgICAgPHRkPmNzSUJNMjczIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDI3NzwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNMjc3PC90ZD4NCisgKiAgICAgICAgIDx0ZD5FQkNESUMtQ1AtREsgRUJDRElDLUNQLU5PIGNzSUJNMjc3IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDI3ODwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNMjc4PC90ZD4NCisgKiAgICAgICAgIDx0ZD5DUDI3OCBlYmNkaWMtY3AtZmkgZWJjZGljLWNwLXNlIGNzSUJNMjc4IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDI4MDwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNMjgwPC90ZD4NCisgKiAgICAgICAgIDx0ZD5lYmNkaWMtY3AtaXQgY3NJQk0yODAgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMjg0PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk0yODQ8L3RkPg0KKyAqICAgICAgICAgPHRkPmViY2RpYy1jcC1lcyBjc0lCTTI4NCA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3AyODU8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTI4NTwvdGQ+DQorICogICAgICAgICA8dGQ+ZWJjZGljLWNwLWdiIGNzSUJNMjg1IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDI5NzwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNMjk3PC90ZD4NCisgKiAgICAgICAgIDx0ZD5lYmNkaWMtY3AtZnIgY3NJQk0yOTcgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwMzM3MjI8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDQyMDwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNNDIwPC90ZD4NCisgKiAgICAgICAgIDx0ZD5lYmNkaWMtY3AtYXIxIGNzSUJNNDIwIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDQyNDwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNNDI0PC90ZD4NCisgKiAgICAgICAgIDx0ZD5lYmNkaWMtY3AtaGUgY3NJQk00MjQgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwNDM3PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk00Mzc8L3RkPg0KKyAqICAgICAgICAgPHRkPjQzNyBjc1BDOENvZGVQYWdlNDM3IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDUwMDwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNNTAwPC90ZD4NCisgKiAgICAgICAgIDx0ZD5lYmNkaWMtY3AtYmUgZWJjZGljLWNwLWNoIGNzSUJNNTAwIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDczNzwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwNzc1PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk03NzU8L3RkPg0KKyAqICAgICAgICAgPHRkPmNzUEM3NzVCYWx0aWMgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODM4PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk0tVGhhaTwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODUwPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk04NTA8L3RkPg0KKyAqICAgICAgICAgPHRkPjg1MCBjc1BDODUwTXVsdGlsaW5ndWFsIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDg1MjwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNODUyPC90ZD4NCisgKiAgICAgICAgIDx0ZD44NTIgY3NQQ3A4NTIgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODU1PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk04NTU8L3RkPg0KKyAqICAgICAgICAgPHRkPjg1NSBjc0lCTTg1NSA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A4NTY8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDg1NzwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNODU3PC90ZD4NCisgKiAgICAgICAgIDx0ZD44NTcgY3NJQk04NTcgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODU4PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk0wMDg1ODwvdGQ+DQorICogICAgICAgICA8dGQ+Q0NTSUQwMDg1OCBDUDAwODU4IFBDLU11bHRpbGluZ3VhbC04NTArZXVybyA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A4NjA8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTg2MDwvdGQ+DQorICogICAgICAgICA8dGQ+ODYwIGNzSUJNODYwIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDg2MTwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNODYxPC90ZD4NCisgKiAgICAgICAgIDx0ZD44NjEgY3AtaXMgY3NJQk04NjEgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODYyPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk04NjI8L3RkPg0KKyAqICAgICAgICAgPHRkPjg2MiBjc1BDODYyTGF0aW5IZWJyZXcgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODYzPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk04NjM8L3RkPg0KKyAqICAgICAgICAgPHRkPjg2MyBjc0lCTTg2MyA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A4NjQ8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTg2NDwvdGQ+DQorICogICAgICAgICA8dGQ+Y3A4NjQgY3NJQk04NjQgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODY1PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk04NjU8L3RkPg0KKyAqICAgICAgICAgPHRkPjg2NSBjc0lCTTg2NSA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A4NjY8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTg2NjwvdGQ+DQorICogICAgICAgICA8dGQ+ODY2IGNzSUJNODY2IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDg2ODwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNODY4PC90ZD4NCisgKiAgICAgICAgIDx0ZD5jcC1hciBjc0lCTTg2OCA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A4Njk8L3RkPg0KKyAqICAgICAgICAgPHRkPklCTTg2OTwvdGQ+DQorICogICAgICAgICA8dGQ+Y3AtZ3IgY3NJQk04NjkgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODcwPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk04NzA8L3RkPg0KKyAqICAgICAgICAgPHRkPmViY2RpYy1jcC1yb2VjZSBlYmNkaWMtY3AteXUgY3NJQk04NzAgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwODcxPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JQk04NzE8L3RkPg0KKyAqICAgICAgICAgPHRkPmViY2RpYy1jcC1pcyBjc0lCTTg3MSA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A4NzU8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDkxODwvdGQ+DQorICogICAgICAgICA8dGQ+SUJNOTE4PC90ZD4NCisgKiAgICAgICAgIDx0ZD5lYmNkaWMtY3AtYXIyIGNzSUJNOTE4IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDkyMTwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwOTIyPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A5MzA8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDkzMzwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwOTM1PC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A5Mzc8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDkzOTwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwOTQyPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A5NDJDPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A5NDM8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDk0M0M8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDk0ODwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwOTQ5PC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A5NDlDPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+Q3A5NTA8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5DcDk2NDwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkNwOTcwPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+RVVDX0NOPC90ZD4NCisgKiAgICAgICAgIDx0ZD5HQjIzMTI8L3RkPg0KKyAqICAgICAgICAgPHRkPngtRVVDLUNOIGNzR0IyMzEyIGV1Y2NuIGV1Yy1jbiBnYjIzMTItODAgZ2IyMzEyLTE5ODAgQ04tR0IgQ04tR0ItSVNPSVIxNjUgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkVVQ19KUDwvdGQ+DQorICogICAgICAgICA8dGQ+RVVDLUpQPC90ZD4NCisgKiAgICAgICAgIDx0ZD5jc0VVQ1BrZEZtdEphcGFuZXNlIEV4dGVuZGVkX1VOSVhfQ29kZV9QYWNrZWRfRm9ybWF0X2Zvcl9KYXBhbmVzZSBldWNqaXMgeC1ldWNqcCBldWNqcCB4LWV1Yy1qcCA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+RVVDX0pQX0xJTlVYPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+RVVDX0pQX1NvbGFyaXM8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5FVUNfS1I8L3RkPg0KKyAqICAgICAgICAgPHRkPkVVQy1LUjwvdGQ+DQorICogICAgICAgICA8dGQ+Y3NFVUNLUiBrc2M1NjAxIDU2MDEga3NjNTYwMV8xOTg3IGtzY181NjAxIGtzYzU2MDEtMTk4NyBrc19jXzU2MDEtMTk4NyBldWNrciA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+RVVDX1RXPC90ZD4NCisgKiAgICAgICAgIDx0ZD5FVUMtVFc8L3RkPg0KKyAqICAgICAgICAgPHRkPngtRVVDLVRXIGNuczExNjQzIGV1Y3R3IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5HQjE4MDMwPC90ZD4NCisgKiAgICAgICAgIDx0ZD5HQjE4MDMwPC90ZD4NCisgKiAgICAgICAgIDx0ZD5nYjE4MDMwLTIwMDAgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkdCSzwvdGQ+DQorICogICAgICAgICA8dGQ+d2luZG93cy05MzY8L3RkPg0KKyAqICAgICAgICAgPHRkPkNQOTM2IE1TOTM2IG1zXzkzNiB4LW1zd2luLTkzNiA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNDSUk5MTwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+eC1JU0NJSTkxIGlzY2lpIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5JU08yMDIyQ048L3RkPg0KKyAqICAgICAgICAgPHRkPklTTy0yMDIyLUNOPC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNPMjAyMkpQPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU08tMjAyMi1KUDwvdGQ+DQorICogICAgICAgICA8dGQ+Y3NJU08yMDIySlAgSklTIGppc19lbmNvZGluZyBjc2ppc2VuY29kaW5nIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5JU08yMDIyS1I8L3RkPg0KKyAqICAgICAgICAgPHRkPklTTy0yMDIyLUtSPC90ZD4NCisgKiAgICAgICAgIDx0ZD5jc0lTTzIwMjJLUiA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNPMjAyMl9DTl9DTlM8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5JU08yMDIyX0NOX0dCPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNPODg1OV8xPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU08tODg1OS0xPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU09fODg1OS0xOjE5ODcgaXNvLWlyLTEwMCBJU09fODg1OS0xIGxhdGluMSBsMSBJQk04MTkgQ1A4MTkgY3NJU09MYXRpbjEgODg1OV8xIDgxOSBJQk0tODE5IElTTzg4NTktMSBJU09fODg1OV8xIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5JU084ODU5XzEzPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU08tODg1OS0xMzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPklTTzg4NTlfMTU8L3RkPg0KKyAqICAgICAgICAgPHRkPklTTy04ODU5LTE1PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU09fODg1OS0xNSBMYXRpbi05IDg4NTlfMTUgY3NJU09sYXRpbjkgSUJNOTIzIGNwOTIzIDkyMyBMOSBJQk0tOTIzIElTTzg4NTktMTUgTEFUSU45IExBVElOMCBjc0lTT2xhdGluMCBJU084ODU5XzE1X0ZESVMgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPklTTzg4NTlfMjwvdGQ+DQorICogICAgICAgICA8dGQ+SVNPLTg4NTktMjwvdGQ+DQorICogICAgICAgICA8dGQ+SVNPXzg4NTktMjoxOTg3IGlzby1pci0xMDEgSVNPXzg4NTktMiBsYXRpbjIgbDIgY3NJU09MYXRpbjIgODg1OV8yIGlzbzg4NTlfMiA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNPODg1OV8zPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU08tODg1OS0zPC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU09fODg1OS0zOjE5ODggaXNvLWlyLTEwOSBJU09fODg1OS0zIGxhdGluMyBsMyBjc0lTT0xhdGluMyA4ODU5XzMgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPklTTzg4NTlfNDwvdGQ+DQorICogICAgICAgICA8dGQ+SVNPLTg4NTktNDwvdGQ+DQorICogICAgICAgICA8dGQ+SVNPXzg4NTktNDoxOTg4IGlzby1pci0xMTAgSVNPXzg4NTktNCBsYXRpbjQgbDQgY3NJU09MYXRpbjQgODg1OV80IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5JU084ODU5XzU8L3RkPg0KKyAqICAgICAgICAgPHRkPklTTy04ODU5LTU8L3RkPg0KKyAqICAgICAgICAgPHRkPklTT184ODU5LTU6MTk4OCBpc28taXItMTQ0IElTT184ODU5LTUgY3lyaWxsaWMgY3NJU09MYXRpbkN5cmlsbGljIDg4NTlfNSA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNPODg1OV82PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU08tODg1OS02PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU09fODg1OS02OjE5ODcgaXNvLWlyLTEyNyBJU09fODg1OS02IEVDTUEtMTE0IEFTTU8tNzA4IGFyYWJpYyBjc0lTT0xhdGluQXJhYmljIDg4NTlfNiA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNPODg1OV83PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU08tODg1OS03PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU09fODg1OS03OjE5ODcgaXNvLWlyLTEyNiBJU09fODg1OS03IEVMT1RfOTI4IEVDTUEtMTE4IGdyZWVrIGdyZWVrOCBjc0lTT0xhdGluR3JlZWsgODg1OV83IHN1bl9ldV9ncmVlayA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNPODg1OV84PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU08tODg1OS04PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU09fODg1OS04OjE5ODggaXNvLWlyLTEzOCBJU09fODg1OS04IGhlYnJldyBjc0lTT0xhdGluSGVicmV3IDg4NTlfOCA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+SVNPODg1OV85PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU08tODg1OS05PC90ZD4NCisgKiAgICAgICAgIDx0ZD5JU09fODg1OS05OjE5ODkgaXNvLWlyLTE0OCBJU09fODg1OS05IGxhdGluNSBsNSBjc0lTT0xhdGluNSA4ODU5XzkgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkpJU0F1dG9EZXRlY3Q8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5KSVNfQzY2MjYtMTk4MzwvdGQ+DQorICogICAgICAgICA8dGQ+SklTX0M2NjI2LTE5ODM8L3RkPg0KKyAqICAgICAgICAgPHRkPngtSklTMDIwOCBKSVMwMjA4IGNzSVNPODdKSVNYMDIwOCB4MDIwOCBKSVNfWDAyMDgtMTk4MyBpc28taXItODcgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkpJU19YMDIwMTwvdGQ+DQorICogICAgICAgICA8dGQ+SklTX1gwMjAxPC90ZD4NCisgKiAgICAgICAgIDx0ZD5YMDIwMSBKSVMwMjAxIGNzSGFsZldpZHRoS2F0YWthbmEgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPkpJU19YMDIxMi0xOTkwPC90ZD4NCisgKiAgICAgICAgIDx0ZD5KSVNfWDAyMTItMTk5MDwvdGQ+DQorICogICAgICAgICA8dGQ+aXNvLWlyLTE1OSB4MDIxMiBKSVMwMjEyIGNzSVNPMTU5SklTWDAyMTIxOTkwIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5LT0k4X1I8L3RkPg0KKyAqICAgICAgICAgPHRkPktPSTgtUjwvdGQ+DQorICogICAgICAgICA8dGQ+Y3NLT0k4UiBrb2k4IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5NUzg3NDwvdGQ+DQorICogICAgICAgICA8dGQ+d2luZG93cy04NzQ8L3RkPg0KKyAqICAgICAgICAgPHRkPmNwODc0IDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5NUzkzMjwvdGQ+DQorICogICAgICAgICA8dGQ+V2luZG93cy0zMUo8L3RkPg0KKyAqICAgICAgICAgPHRkPndpbmRvd3MtOTMyIGNzV2luZG93czMxSiB4LW1zLWNwOTMyIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5NUzk0OTwvdGQ+DQorICogICAgICAgICA8dGQ+d2luZG93cy05NDk8L3RkPg0KKyAqICAgICAgICAgPHRkPndpbmRvd3M5NDkgbXNfOTQ5IHgtd2luZG93cy05NDkgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1TOTUwPC90ZD4NCisgKiAgICAgICAgIDx0ZD53aW5kb3dzLTk1MDwvdGQ+DQorICogICAgICAgICA8dGQ+eC13aW5kb3dzLTk1MCA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+TVM5NTBfSEtTQ1M8L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1hY0FyYWJpYzwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1hY0NlbnRyYWxFdXJvcGU8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5NYWNDcm9hdGlhbjwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1hY0N5cmlsbGljPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+TWFjRGluZ2JhdDwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1hY0dyZWVrPC90ZD4NCisgKiAgICAgICAgIDx0ZD5NYWNHcmVlazwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1hY0hlYnJldzwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1hY0ljZWxhbmQ8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5NYWNSb21hbjwvdGQ+DQorICogICAgICAgICA8dGQ+TWFjUm9tYW48L3RkPg0KKyAqICAgICAgICAgPHRkPk1hY2ludG9zaCBNQUMgY3NNYWNpbnRvc2ggPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1hY1JvbWFuaWE8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5NYWNTeW1ib2w8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5NYWNUaGFpPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+TWFjVHVya2lzaDwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPk1hY1VrcmFpbmU8L3RkPg0KKyAqICAgICAgICAgPHRkPj88L3RkPg0KKyAqICAgICAgICAgPHRkPjwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5TSklTPC90ZD4NCisgKiAgICAgICAgIDx0ZD5TaGlmdF9KSVM8L3RkPg0KKyAqICAgICAgICAgPHRkPk1TX0thbmppIGNzU2hpZnRKSVMgc2hpZnQtamlzIHgtc2ppcyBwY2sgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPlRJUzYyMDwvdGQ+DQorICogICAgICAgICA8dGQ+VElTLTYyMDwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPlVURi0xNjwvdGQ+DQorICogICAgICAgICA8dGQ+VVRGLTE2PC90ZD4NCisgKiAgICAgICAgIDx0ZD5VVEZfMTYgPC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPlVURjg8L3RkPg0KKyAqICAgICAgICAgPHRkPlVURi04PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+VW5pY29kZUJpZzwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiAgICAgPHRyPg0KKyAqICAgICAgICAgPHRkPlVuaWNvZGVCaWdVbm1hcmtlZDwvdGQ+DQorICogICAgICAgICA8dGQ+VVRGLTE2QkU8L3RkPg0KKyAqICAgICAgICAgPHRkPlgtVVRGLTE2QkUgVVRGXzE2QkUgSVNPLTEwNjQ2LVVDUy0yIDwvdGQ+DQorICogICAgIDwvdHI+DQorICogICAgIDx0cj4NCisgKiAgICAgICAgIDx0ZD5Vbmljb2RlTGl0dGxlPC90ZD4NCisgKiAgICAgICAgIDx0ZD4/PC90ZD4NCisgKiAgICAgICAgIDx0ZD48L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+VW5pY29kZUxpdHRsZVVubWFya2VkPC90ZD4NCisgKiAgICAgICAgIDx0ZD5VVEYtMTZMRTwvdGQ+DQorICogICAgICAgICA8dGQ+VVRGXzE2TEUgWC1VVEYtMTZMRSA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+eC1Kb2hhYjwvdGQ+DQorICogICAgICAgICA8dGQ+am9oYWI8L3RkPg0KKyAqICAgICAgICAgPHRkPmpvaGFiIGNwMTM2MSBtczEzNjEga3NjNTYwMS0xOTkyIGtzYzU2MDFfMTk5MiA8L3RkPg0KKyAqICAgICA8L3RyPg0KKyAqICAgICA8dHI+DQorICogICAgICAgICA8dGQ+eC1pc28tODg1OS0xMTwvdGQ+DQorICogICAgICAgICA8dGQ+PzwvdGQ+DQorICogICAgICAgICA8dGQ+PC90ZD4NCisgKiAgICAgPC90cj4NCisgKiA8L3RhYmxlPg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBDaGFyc2V0VXRpbCB7DQorICAgIHByaXZhdGUgc3RhdGljIExvZyBsb2cgPSBMb2dGYWN0b3J5LmdldExvZyhDaGFyc2V0VXRpbC5jbGFzcyk7DQorICAgIA0KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFyc2V0IGltcGxlbWVudHMgQ29tcGFyYWJsZTxDaGFyc2V0PiB7DQorICAgICAgICBwcml2YXRlIFN0cmluZyBjYW5vbmljYWwgPSBudWxsOw0KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWltZSA9IG51bGw7DQorICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGFsaWFzZXMgPSBudWxsOw0KKyAgICAgICAgDQorICAgICAgICBwcml2YXRlIENoYXJzZXQoU3RyaW5nIGNhbm9uaWNhbCwgU3RyaW5nIG1pbWUsIFN0cmluZ1tdIGFsaWFzZXMpIHsNCisgICAgICAgICAgICB0aGlzLmNhbm9uaWNhbCA9IGNhbm9uaWNhbDsNCisgICAgICAgICAgICB0aGlzLm1pbWUgPSBtaW1lOw0KKyAgICAgICAgICAgIHRoaXMuYWxpYXNlcyA9IGFsaWFzZXM7DQorICAgICAgICB9DQorDQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhDaGFyc2V0IGMpIHsNCisgICAgICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWwuY29tcGFyZVRvKGMuY2Fub25pY2FsKTsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldFtdIEpBVkFfQ0hBUlNFVFMgPSB7DQorICAgICAgICBuZXcgQ2hhcnNldCgiSVNPODg1OV8xIiwgIklTTy04ODU5LTEiLCANCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IklTT184ODU5LTE6MTk4NyIsICJpc28taXItMTAwIiwgIklTT184ODU5LTEiLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhdGluMSIsICJsMSIsICJJQk04MTkiLCAiQ1A4MTkiLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNzSVNPTGF0aW4xIiwgIjg4NTlfMSIsICI4MTkiLCAiSUJNLTgxOSIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVNPODg1OS0xIiwgIklTT184ODU5XzEifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiSVNPODg1OV8yIiwgIklTTy04ODU5LTIiLCANCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IklTT184ODU5LTI6MTk4NyIsICJpc28taXItMTAxIiwgIklTT184ODU5LTIiLCAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXRpbjIiLCAibDIiLCAiY3NJU09MYXRpbjIiLCAiODg1OV8yIiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc284ODU5XzIifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiSVNPODg1OV8zIiwgIklTTy04ODU5LTMiLCBuZXcgU3RyaW5nW10geyJJU09fODg1OS0zOjE5ODgiLCAiaXNvLWlyLTEwOSIsICJJU09fODg1OS0zIiwgImxhdGluMyIsICJsMyIsICJjc0lTT0xhdGluMyIsICI4ODU5XzMifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiSVNPODg1OV80IiwgIklTTy04ODU5LTQiLCANCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IklTT184ODU5LTQ6MTk4OCIsICJpc28taXItMTEwIiwgIklTT184ODU5LTQiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF0aW40IiwgImw0IiwgImNzSVNPTGF0aW40IiwgIjg4NTlfNCJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJJU084ODU5XzUiLCAiSVNPLTg4NTktNSIsIA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiSVNPXzg4NTktNToxOTg4IiwgImlzby1pci0xNDQiLCAiSVNPXzg4NTktNSIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3lyaWxsaWMiLCAiY3NJU09MYXRpbkN5cmlsbGljIiwgIjg4NTlfNSJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJJU084ODU5XzYiLCAiSVNPLTg4NTktNiIsIG5ldyBTdHJpbmdbXSB7IklTT184ODU5LTY6MTk4NyIsICJpc28taXItMTI3IiwgIklTT184ODU5LTYiLCAiRUNNQS0xMTQiLCAiQVNNTy03MDgiLCAiYXJhYmljIiwgImNzSVNPTGF0aW5BcmFiaWMiLCAiODg1OV82In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIklTTzg4NTlfNyIsICJJU08tODg1OS03IiwgDQorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJJU09fODg1OS03OjE5ODciLCAiaXNvLWlyLTEyNiIsICJJU09fODg1OS03IiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFTE9UXzkyOCIsICJFQ01BLTExOCIsICJncmVlayIsICJncmVlazgiLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNzSVNPTGF0aW5HcmVlayIsICI4ODU5XzciLCAic3VuX2V1X2dyZWVrIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIklTTzg4NTlfOCIsICJJU08tODg1OS04IiwgbmV3IFN0cmluZ1tdIHsiSVNPXzg4NTktODoxOTg4IiwgImlzby1pci0xMzgiLCAiSVNPXzg4NTktOCIsICJoZWJyZXciLCAiY3NJU09MYXRpbkhlYnJldyIsICI4ODU5XzgifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiSVNPODg1OV85IiwgIklTTy04ODU5LTkiLCANCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IklTT184ODU5LTk6MTk4OSIsICJpc28taXItMTQ4IiwgIklTT184ODU5LTkiLCAgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXRpbjUiLCAibDUiLCAiY3NJU09MYXRpbjUiLCAiODg1OV85In0pLA0KKw0KKyAgICAgICAgbmV3IENoYXJzZXQoIklTTzg4NTlfMTMiLCAiSVNPLTg4NTktMTMiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIklTTzg4NTlfMTUiLCAiSVNPLTg4NTktMTUiLCANCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IklTT184ODU5LTE1IiwgIkxhdGluLTkiLCAiODg1OV8xNSIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3NJU09sYXRpbjkiLCAiSUJNOTIzIiwgImNwOTIzIiwgIjkyMyIsICJMOSIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQk0tOTIzIiwgIklTTzg4NTktMTUiLCAiTEFUSU45IiwgIkxBVElOMCIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3NJU09sYXRpbjAiLCAiSVNPODg1OV8xNV9GRElTIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIktPSThfUiIsICJLT0k4LVIiLCBuZXcgU3RyaW5nW10geyJjc0tPSThSIiwgImtvaTgifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQVNDSUkiLCAiVVMtQVNDSUkiLCANCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IkFOU0lfWDMuNC0xOTY4IiwgImlzby1pci02IiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBTlNJX1gzLjQtMTk4NiIsICJJU09fNjQ2LmlydjoxOTkxIiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJU082NDYtVVMiLCAidXMiLCAiSUJNMzY3IiwgImNwMzY3IiwgDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjc0FTQ0lJIiwgImFzY2lpNyIsICI2NDYiLCAiaXNvXzY0Ni5pcnY6MTk4MyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJVVEY4IiwgIlVURi04IiwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJVVEYtMTYiLCAiVVRGLTE2IiwgbmV3IFN0cmluZ1tdIHsiVVRGXzE2In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIlVuaWNvZGVCaWdVbm1hcmtlZCIsICJVVEYtMTZCRSIsIG5ldyBTdHJpbmdbXSB7IlgtVVRGLTE2QkUiLCAiVVRGXzE2QkUiLCAiSVNPLTEwNjQ2LVVDUy0yIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIlVuaWNvZGVMaXR0bGVVbm1hcmtlZCIsICJVVEYtMTZMRSIsIG5ldyBTdHJpbmdbXSB7IlVURl8xNkxFIiwgIlgtVVRGLTE2TEUifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQmlnNSIsICJCaWc1IiwgbmV3IFN0cmluZ1tdIHsiY3NCaWc1IiwgIkNOLUJpZzUiLCAiQklHLUZJVkUiLCAiQklHRklWRSJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJCaWc1X0hLU0NTIiwgIkJpZzUtSEtTQ1MiLCBuZXcgU3RyaW5nW10geyJiaWc1aGtzY3MifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiRVVDX0pQIiwgIkVVQy1KUCIsIA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsiY3NFVUNQa2RGbXRKYXBhbmVzZSIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHRlbmRlZF9VTklYX0NvZGVfUGFja2VkX0Zvcm1hdF9mb3JfSmFwYW5lc2UiLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldWNqaXMiLCAieC1ldWNqcCIsICJldWNqcCIsICJ4LWV1Yy1qcCJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJFVUNfS1IiLCAiRVVDLUtSIiwgDQorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJjc0VVQ0tSIiwgImtzYzU2MDEiLCAiNTYwMSIsICJrc2M1NjAxXzE5ODciLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtzY181NjAxIiwgImtzYzU2MDEtMTk4NyIsICJrc19jXzU2MDEtMTk4NyIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXVja3IifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiR0IxODAzMCIsICJHQjE4MDMwIiwgbmV3IFN0cmluZ1tdIHsiZ2IxODAzMC0yMDAwIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkVVQ19DTiIsICJHQjIzMTIiLCBuZXcgU3RyaW5nW10geyJ4LUVVQy1DTiIsICJjc0dCMjMxMiIsICJldWNjbiIsICJldWMtY24iLCAiZ2IyMzEyLTgwIiwgImdiMjMxMi0xOTgwIiwgIkNOLUdCIiwgIkNOLUdCLUlTT0lSMTY1In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkdCSyIsICJ3aW5kb3dzLTkzNiIsIG5ldyBTdHJpbmdbXSB7IkNQOTM2IiwgIk1TOTM2IiwgIm1zXzkzNiIsICJ4LW1zd2luLTkzNiJ9KSwNCisNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDAzNyIsICJJQk0wMzciLCBuZXcgU3RyaW5nW10geyJlYmNkaWMtY3AtdXMiLCAiZWJjZGljLWNwLWNhIiwgImViY2RpYy1jcC13dCIsICJlYmNkaWMtY3AtbmwiLCAiY3NJQk0wMzcifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AyNzMiLCAiSUJNMjczIiwgbmV3IFN0cmluZ1tdIHsiY3NJQk0yNzMifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AyNzciLCAiSUJNMjc3IiwgbmV3IFN0cmluZ1tdIHsiRUJDRElDLUNQLURLIiwgIkVCQ0RJQy1DUC1OTyIsICJjc0lCTTI3NyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDI3OCIsICJJQk0yNzgiLCBuZXcgU3RyaW5nW10geyJDUDI3OCIsICJlYmNkaWMtY3AtZmkiLCAiZWJjZGljLWNwLXNlIiwgImNzSUJNMjc4In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMjgwIiwgIklCTTI4MCIsIG5ldyBTdHJpbmdbXSB7ImViY2RpYy1jcC1pdCIsICJjc0lCTTI4MCJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDI4NCIsICJJQk0yODQiLCBuZXcgU3RyaW5nW10geyJlYmNkaWMtY3AtZXMiLCAiY3NJQk0yODQifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AyODUiLCAiSUJNMjg1IiwgbmV3IFN0cmluZ1tdIHsiZWJjZGljLWNwLWdiIiwgImNzSUJNMjg1In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMjk3IiwgIklCTTI5NyIsIG5ldyBTdHJpbmdbXSB7ImViY2RpYy1jcC1mciIsICJjc0lCTTI5NyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDQyMCIsICJJQk00MjAiLCBuZXcgU3RyaW5nW10geyJlYmNkaWMtY3AtYXIxIiwgImNzSUJNNDIwIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwNDI0IiwgIklCTTQyNCIsIG5ldyBTdHJpbmdbXSB7ImViY2RpYy1jcC1oZSIsICJjc0lCTTQyNCJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDQzNyIsICJJQk00MzciLCBuZXcgU3RyaW5nW10geyI0MzciLCAiY3NQQzhDb2RlUGFnZTQzNyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDUwMCIsICJJQk01MDAiLCBuZXcgU3RyaW5nW10geyJlYmNkaWMtY3AtYmUiLCAiZWJjZGljLWNwLWNoIiwgImNzSUJNNTAwIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwNzc1IiwgIklCTTc3NSIsIG5ldyBTdHJpbmdbXSB7ImNzUEM3NzVCYWx0aWMifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A4MzgiLCAiSUJNLVRoYWkiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODUwIiwgIklCTTg1MCIsIG5ldyBTdHJpbmdbXSB7Ijg1MCIsICJjc1BDODUwTXVsdGlsaW5ndWFsIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODUyIiwgIklCTTg1MiIsIG5ldyBTdHJpbmdbXSB7Ijg1MiIsICJjc1BDcDg1MiJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDg1NSIsICJJQk04NTUiLCBuZXcgU3RyaW5nW10geyI4NTUiLCAiY3NJQk04NTUifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A4NTciLCAiSUJNODU3IiwgbmV3IFN0cmluZ1tdIHsiODU3IiwgImNzSUJNODU3In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODU4IiwgIklCTTAwODU4IiwgDQorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IkNDU0lEMDA4NTgiLCAiQ1AwMDg1OCIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQy1NdWx0aWxpbmd1YWwtODUwK2V1cm8ifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A4NjAiLCAiSUJNODYwIiwgbmV3IFN0cmluZ1tdIHsiODYwIiwgImNzSUJNODYwIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODYxIiwgIklCTTg2MSIsIG5ldyBTdHJpbmdbXSB7Ijg2MSIsICJjcC1pcyIsICJjc0lCTTg2MSJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDg2MiIsICJJQk04NjIiLCBuZXcgU3RyaW5nW10geyI4NjIiLCAiY3NQQzg2MkxhdGluSGVicmV3In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODYzIiwgIklCTTg2MyIsIG5ldyBTdHJpbmdbXSB7Ijg2MyIsICJjc0lCTTg2MyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDg2NCIsICJJQk04NjQiLCBuZXcgU3RyaW5nW10geyJjcDg2NCIsICJjc0lCTTg2NCJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDg2NSIsICJJQk04NjUiLCBuZXcgU3RyaW5nW10geyI4NjUiLCAiY3NJQk04NjUifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A4NjYiLCAiSUJNODY2IiwgbmV3IFN0cmluZ1tdIHsiODY2IiwgImNzSUJNODY2In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODY4IiwgIklCTTg2OCIsIG5ldyBTdHJpbmdbXSB7ImNwLWFyIiwgImNzSUJNODY4In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODY5IiwgIklCTTg2OSIsIG5ldyBTdHJpbmdbXSB7ImNwLWdyIiwgImNzSUJNODY5In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODcwIiwgIklCTTg3MCIsIG5ldyBTdHJpbmdbXSB7ImViY2RpYy1jcC1yb2VjZSIsICJlYmNkaWMtY3AteXUiLCAiY3NJQk04NzAifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A4NzEiLCAiSUJNODcxIiwgbmV3IFN0cmluZ1tdIHsiZWJjZGljLWNwLWlzIiwgImNzSUJNODcxIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwOTE4IiwgIklCTTkxOCIsIG5ldyBTdHJpbmdbXSB7ImViY2RpYy1jcC1hcjIiLCAiY3NJQk05MTgifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AxMDI2IiwgIklCTTEwMjYiLCBuZXcgU3RyaW5nW10geyJjc0lCTTEwMjYifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AxMDQ3IiwgIklCTTEwNDciLCBuZXcgU3RyaW5nW10geyJJQk0tMTA0NyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDExNDAiLCAiSUJNMDExNDAiLCANCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IkNDU0lEMDExNDAiLCAiQ1AwMTE0MCIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWJjZGljLXVzLTM3K2V1cm8ifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AxMTQxIiwgIklCTTAxMTQxIiwgDQorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJDQ1NJRDAxMTQxIiwgIkNQMDExNDEiLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImViY2RpYy1kZS0yNzMrZXVybyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDExNDIiLCAiSUJNMDExNDIiLCBuZXcgU3RyaW5nW10geyJDQ1NJRDAxMTQyIiwgIkNQMDExNDIiLCAiZWJjZGljLWRrLTI3NytldXJvIiwgImViY2RpYy1uby0yNzcrZXVybyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDExNDMiLCAiSUJNMDExNDMiLCBuZXcgU3RyaW5nW10geyJDQ1NJRDAxMTQzIiwgIkNQMDExNDMiLCAiZWJjZGljLWZpLTI3OCtldXJvIiwgImViY2RpYy1zZS0yNzgrZXVybyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDExNDQiLCAiSUJNMDExNDQiLCBuZXcgU3RyaW5nW10geyJDQ1NJRDAxMTQ0IiwgIkNQMDExNDQiLCAiZWJjZGljLWl0LTI4MCtldXJvIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTE0NSIsICJJQk0wMTE0NSIsIG5ldyBTdHJpbmdbXSB7IkNDU0lEMDExNDUiLCAiQ1AwMTE0NSIsICJlYmNkaWMtZXMtMjg0K2V1cm8ifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AxMTQ2IiwgIklCTTAxMTQ2IiwgbmV3IFN0cmluZ1tdIHsiQ0NTSUQwMTE0NiIsICJDUDAxMTQ2IiwgImViY2RpYy1nYi0yODUrZXVybyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDExNDciLCAiSUJNMDExNDciLCBuZXcgU3RyaW5nW10geyJDQ1NJRDAxMTQ3IiwgIkNQMDExNDciLCAiZWJjZGljLWZyLTI5NytldXJvIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTE0OCIsICJJQk0wMTE0OCIsIG5ldyBTdHJpbmdbXSB7IkNDU0lEMDExNDgiLCAiQ1AwMTE0OCIsICJlYmNkaWMtaW50ZXJuYXRpb25hbC01MDArZXVybyJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDExNDkiLCAiSUJNMDExNDkiLCBuZXcgU3RyaW5nW10geyJDQ1NJRDAxMTQ5IiwgIkNQMDExNDkiLCAiZWJjZGljLWlzLTg3MStldXJvIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1MCIsICJ3aW5kb3dzLTEyNTAiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1MSIsICJ3aW5kb3dzLTEyNTEiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1MiIsICJ3aW5kb3dzLTEyNTIiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1MyIsICJ3aW5kb3dzLTEyNTMiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1NCIsICJ3aW5kb3dzLTEyNTQiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1NSIsICJ3aW5kb3dzLTEyNTUiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1NiIsICJ3aW5kb3dzLTEyNTYiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1NyIsICJ3aW5kb3dzLTEyNTciLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTI1OCIsICJ3aW5kb3dzLTEyNTgiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIklTTzIwMjJDTiIsICJJU08tMjAyMi1DTiIsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiSVNPMjAyMkpQIiwgIklTTy0yMDIyLUpQIiwgbmV3IFN0cmluZ1tdIHsiY3NJU08yMDIySlAiLCAiSklTIiwgImppc19lbmNvZGluZyIsICJjc2ppc2VuY29kaW5nIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIklTTzIwMjJLUiIsICJJU08tMjAyMi1LUiIsIG5ldyBTdHJpbmdbXSB7ImNzSVNPMjAyMktSIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkpJU19YMDIwMSIsICJKSVNfWDAyMDEiLCBuZXcgU3RyaW5nW10geyJYMDIwMSIsICJKSVMwMjAxIiwgImNzSGFsZldpZHRoS2F0YWthbmEifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiSklTX1gwMjEyLTE5OTAiLCAiSklTX1gwMjEyLTE5OTAiLCBuZXcgU3RyaW5nW10geyJpc28taXItMTU5IiwgIngwMjEyIiwgIkpJUzAyMTIiLCAiY3NJU08xNTlKSVNYMDIxMjE5OTAifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiSklTX0M2NjI2LTE5ODMiLCAiSklTX0M2NjI2LTE5ODMiLCBuZXcgU3RyaW5nW10geyJ4LUpJUzAyMDgiLCAiSklTMDIwOCIsICJjc0lTTzg3SklTWDAyMDgiLCAieDAyMDgiLCAiSklTX1gwMjA4LTE5ODMiLCAiaXNvLWlyLTg3In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIlNKSVMiLCAiU2hpZnRfSklTIiwgbmV3IFN0cmluZ1tdIHsiTVNfS2FuamkiLCAiY3NTaGlmdEpJUyIsICJzaGlmdC1qaXMiLCAieC1zamlzIiwgInBjayJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJUSVM2MjAiLCAiVElTLTYyMCIsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTVM5MzIiLCAiV2luZG93cy0zMUoiLCBuZXcgU3RyaW5nW10geyJ3aW5kb3dzLTkzMiIsICJjc1dpbmRvd3MzMUoiLCAieC1tcy1jcDkzMiJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJFVUNfVFciLCAiRVVDLVRXIiwgbmV3IFN0cmluZ1tdIHsieC1FVUMtVFciLCAiY25zMTE2NDMiLCAiZXVjdHcifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgieC1Kb2hhYiIsICJqb2hhYiIsIG5ldyBTdHJpbmdbXSB7ImpvaGFiIiwgImNwMTM2MSIsICJtczEzNjEiLCAia3NjNTYwMS0xOTkyIiwgImtzYzU2MDFfMTk5MiJ9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJNUzk1MF9IS1NDUyIsICIiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIk1TODc0IiwgIndpbmRvd3MtODc0IiwgbmV3IFN0cmluZ1tdIHsiY3A4NzQifSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTVM5NDkiLCAid2luZG93cy05NDkiLCBuZXcgU3RyaW5nW10geyJ3aW5kb3dzOTQ5IiwgIm1zXzk0OSIsICJ4LXdpbmRvd3MtOTQ5In0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIk1TOTUwIiwgIndpbmRvd3MtOTUwIiwgbmV3IFN0cmluZ1tdIHsieC13aW5kb3dzLTk1MCJ9KSwNCisNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDczNyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A4NTYiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwODc1IiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDkyMSIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A5MjIiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwOTMwIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDkzMyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A5MzUiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwOTM3IiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDkzOSIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A5NDIiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwOTQyQyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A5NDMiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwOTQzQyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A5NDgiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwOTQ5IiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDk0OUMiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwOTUwIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDk2NCIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3A5NzAiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTAwNiIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AxMDI1IiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwgICAgDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AxMDQ2IiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDEwOTciLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTA5OCIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AxMTEyIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDExMjIiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTEyMyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AxMTI0IiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJDcDEzODEiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkNwMTM4MyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQ3AzMzcyMiIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiQmlnNV9Tb2xhcmlzIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJFVUNfSlBfTElOVVgiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIkVVQ19KUF9Tb2xhcmlzIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJJU0NJSTkxIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHsieC1JU0NJSTkxIiwgImlzY2lpIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIklTTzIwMjJfQ05fQ05TIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJJU08yMDIyX0NOX0dCIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJ4LWlzby04ODU5LTExIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJKSVNBdXRvRGV0ZWN0IiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJNYWNBcmFiaWMiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIk1hY0NlbnRyYWxFdXJvcGUiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIk1hY0Nyb2F0aWFuIiwgbnVsbCwgbmV3IFN0cmluZ1tdIHt9KSwNCisgICAgICAgIG5ldyBDaGFyc2V0KCJNYWNDeXJpbGxpYyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTWFjRGluZ2JhdCIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTWFjR3JlZWsiLCAiTWFjR3JlZWsiLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIk1hY0hlYnJldyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTWFjSWNlbGFuZCIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTWFjUm9tYW4iLCAiTWFjUm9tYW4iLCBuZXcgU3RyaW5nW10geyJNYWNpbnRvc2giLCAiTUFDIiwgImNzTWFjaW50b3NoIn0pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIk1hY1JvbWFuaWEiLCBudWxsLCBuZXcgU3RyaW5nW10ge30pLA0KKyAgICAgICAgbmV3IENoYXJzZXQoIk1hY1N5bWJvbCIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTWFjVGhhaSIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTWFjVHVya2lzaCIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiTWFjVWtyYWluZSIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiVW5pY29kZUJpZyIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSksDQorICAgICAgICBuZXcgQ2hhcnNldCgiVW5pY29kZUxpdHRsZSIsIG51bGwsIG5ldyBTdHJpbmdbXSB7fSkNCisgICAgfTsNCisNCisgICAgLyoqDQorICAgICAqIENvbnRhaW5zIHRoZSBjYW5vbmljYWwgbmFtZXMgb2YgY2hhcmFjdGVyIHNldHMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gDQorICAgICAqIGRlY29kZSBieXRlcyBpbnRvIEphdmEgY2hhcnMuDQorICAgICAqLw0KKyAgICBwcml2YXRlIHN0YXRpYyBTb3J0ZWRTZXQ8U3RyaW5nPiBkZWNvZGluZ1N1cHBvcnRlZCA9IG51bGw7DQorICAgIA0KKyAgICAvKioNCisgICAgICogQ29udGFpbnMgdGhlIGNhbm9uaWNhbCBuYW1lcyBvZiBjaGFyYWN0ZXIgc2V0cyB3aGljaCBjYW4gYmUgdXNlZCB0byANCisgICAgICogZW5jb2RlIEphdmEgY2hhcnMgaW50byBieXRlcy4NCisgICAgICovDQorICAgIHByaXZhdGUgc3RhdGljIFNvcnRlZFNldDxTdHJpbmc+IGVuY29kaW5nU3VwcG9ydGVkID0gbnVsbDsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBNYXBzIGNoYXJhY3RlciBzZXQgbmFtZXMgdG8gQ2hhcnNldCBvYmplY3RzLiBBbGwgcG9zc2libGUgbmFtZXMgb2YNCisgICAgICogYSBjaGFyc2V0IHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBDaGFyc2V0Lg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQ2hhcnNldD4gY2hhcnNldE1hcCA9IG51bGw7DQorICAgIA0KKyAgICBzdGF0aWMgew0KKyAgICAgICAgZGVjb2RpbmdTdXBwb3J0ZWQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7DQorICAgICAgICBlbmNvZGluZ1N1cHBvcnRlZCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsNCisgICAgICAgIGJ5dGVbXSBkdW1teSA9IG5ldyBieXRlW10geydkJywgJ3UnLCAnbScsICdtJywgJ3knfTsNCisgICAgICAgIGZvciAoQ2hhcnNldCBjIDogSkFWQV9DSEFSU0VUUykgew0KKyAgICAgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoZHVtbXksIGMuY2Fub25pY2FsKTsNCisgICAgICAgICAgICAgICAgZGVjb2RpbmdTdXBwb3J0ZWQuYWRkKGMuY2Fub25pY2FsLnRvTG93ZXJDYXNlKCkpOw0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgImR1bW15Ii5nZXRCeXRlcyhjLmNhbm9uaWNhbCk7DQorICAgICAgICAgICAgICAgIGVuY29kaW5nU3VwcG9ydGVkLmFkZChjLmNhbm9uaWNhbC50b0xvd2VyQ2FzZSgpKTsNCisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBjaGFyc2V0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDaGFyc2V0PigpOw0KKyAgICAgICAgZm9yIChDaGFyc2V0IGMgOiBKQVZBX0NIQVJTRVRTKSB7DQorICAgICAgICAgICAgY2hhcnNldE1hcC5wdXQoYy5jYW5vbmljYWwudG9Mb3dlckNhc2UoKSwgYyk7DQorICAgICAgICAgICAgaWYgKGMubWltZSAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGNoYXJzZXRNYXAucHV0KGMubWltZS50b0xvd2VyQ2FzZSgpLCBjKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgaWYgKGMuYWxpYXNlcyAhPSBudWxsKSB7DQorICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHN0ciA6IGMuYWxpYXNlcykgew0KKyAgICAgICAgICAgICAgICAgICAgY2hhcnNldE1hcC5wdXQoc3RyLnRvTG93ZXJDYXNlKCksIGMpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsNCisgICAgICAgICAgICBsb2cuZGVidWcoIkNoYXJhY3RlciBzZXRzIHdoaWNoIHN1cHBvcnQgZGVjb2Rpbmc6ICIgDQorICAgICAgICAgICAgICAgICAgICAgICAgKyBkZWNvZGluZ1N1cHBvcnRlZCk7DQorICAgICAgICAgICAgbG9nLmRlYnVnKCJDaGFyYWN0ZXIgc2V0cyB3aGljaCBzdXBwb3J0IGVuY29kaW5nOiAiIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgZW5jb2RpbmdTdXBwb3J0ZWQpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKiBjYXJyaWFnZSByZXR1cm4gLSBsaW5lIGZlZWQgc2VxdWVuY2UgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsNCisNCisgICAgLyoqIFVTLUFTQ0lJIENSLCBjYXJyaWFnZSByZXR1cm4gKDEzKSAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDUiA9ICdccic7DQorDQorICAgIC8qKiBVUy1BU0NJSSBMRiwgbGluZSBmZWVkICgxMCkgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEYgPSAnXG4nOw0KKw0KKyAgICAvKiogVVMtQVNDSUkgU1AsIHNwYWNlICgzMikgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1AgPSAnICc7DQorDQorICAgIC8qKiBVUy1BU0NJSSBIVCwgaG9yaXpvbnRhbC10YWIgKDkpICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUID0gJ1x0JzsNCisNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgVVNfQVNDSUkgPSBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQNCisgICAgICAgICAgICAuZm9yTmFtZSgiVVMtQVNDSUkiKTsNCisNCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgSVNPXzg4NTlfMSA9IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldA0KKyAgICAgICAgICAgIC5mb3JOYW1lKCJJU08tODg1OS0xIik7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IFVURl84ID0gamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0DQorICAgICAgICAgICAgLmZvck5hbWUoIlVURi04Iik7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IERFRkFVTFRfQ0hBUlNFVCA9IFVTX0FTQ0lJOw0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmYWxscyBpbnRvIHRoZSBVUw0KKyAgICAgKiBBU0NJSSBjaGFyYWN0ZXIgc2V0IChVbmljb2RlIHJhbmdlIDAwMDAgdG8gMDA3ZikuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gY2gNCisgICAgICogICAgICAgICAgICBjaGFyYWN0ZXIgdG8gdGVzdC4NCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmYWxscyBpbnRvIHRoZSBVUw0KKyAgICAgKiAgICAgICAgIEFTQ0lJIGNoYXJhY3RlciBzZXQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBU0NJSShjaGFyIGNoKSB7DQorICAgICAgICByZXR1cm4gKDB4RkY4MCAmIGNoKSA9PSAwOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnNpc3RzIGVudGlyZWx5IG9mDQorICAgICAqIFVTIEFTQ0lJIGNoYXJhY3RlcnMuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcw0KKyAgICAgKiAgICAgICAgICAgIHN0cmluZyB0byB0ZXN0Lg0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnNpc3RzIGVudGlyZWx5IG9mDQorICAgICAqICAgICAgICAgVVMgQVNDSUkgY2hhcmFjdGVycywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FTQ0lJKGZpbmFsIFN0cmluZyBzKSB7DQorICAgICAgICBpZiAocyA9PSBudWxsKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIG1heSBub3QgYmUgbnVsbCIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZmluYWwgaW50IGxlbiA9IHMubGVuZ3RoKCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7DQorICAgICAgICAgICAgaWYgKCFpc0FTQ0lJKHMuY2hhckF0KGkpKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgYSB3aGl0ZXNwYWNlDQorICAgICAqIGNoYXJhY3RlciAoQ1IsIExGLCBTUCBvciBIVCkuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gY2gNCisgICAgICogICAgICAgICAgICBjaGFyYWN0ZXIgdG8gdGVzdC4NCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBhIHdoaXRlc3BhY2UNCisgICAgICogICAgICAgICBjaGFyYWN0ZXIsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgY2gpIHsNCisgICAgICAgIHJldHVybiBjaCA9PSBTUCB8fCBjaCA9PSBIVCB8fCBjaCA9PSBDUiB8fCBjaCA9PSBMRjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb25zaXN0cyBlbnRpcmVseSBvZg0KKyAgICAgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcw0KKyAgICAgKiAgICAgICAgICAgIHN0cmluZyB0byB0ZXN0Lg0KKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnNpc3RzIGVudGlyZWx5IG9mDQorICAgICAqICAgICAgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2hpdGVzcGFjZShmaW5hbCBTdHJpbmcgcykgew0KKyAgICAgICAgaWYgKHMgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBtYXkgbm90IGJlIG51bGwiKTsNCisgICAgICAgIH0NCisgICAgICAgIGZpbmFsIGludCBsZW4gPSBzLmxlbmd0aCgpOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgew0KKyAgICAgICAgICAgIGlmICghaXNXaGl0ZXNwYWNlKHMuY2hhckF0KGkpKSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHRydWU7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBWTSBzdXBwb3J0cyBlbmNvZGluZyAoY2hhcnMgdG8gYnl0ZXMpIHRoZSANCisgICAgICogc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQuIE5PVEU6IHRoZSBnaXZlbiBjaGFyYWN0ZXIgc2V0IG5hbWUgbWF5IA0KKyAgICAgKiBub3QgYmUga25vd24gdG8gdGhlIFZNIGV2ZW4gaWYgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPi4NCisgICAgICogVXNlIHtAbGluayAjdG9KYXZhQ2hhcnNldChTdHJpbmcpfSB0byBnZXQgdGhlIGNhbm9uaWNhbCBKYXZhIGNoYXJhY3Rlcg0KKyAgICAgKiBzZXQgbmFtZS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZSB0aGUgY2hhcmFjdGVycyBzZXQgbmFtZS4NCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBlbmNvZGluZyBpcyBzdXBwb3J0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPg0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VuY29kaW5nU3VwcG9ydGVkKFN0cmluZyBjaGFyc2V0TmFtZSkgew0KKyAgICAgICAgcmV0dXJuIGVuY29kaW5nU3VwcG9ydGVkLmNvbnRhaW5zKGNoYXJzZXROYW1lLnRvTG93ZXJDYXNlKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgVk0gc3VwcG9ydHMgZGVjb2RpbmcgKGJ5dGVzIHRvIGNoYXJzKSB0aGUgDQorICAgICAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgc2V0LiBOT1RFOiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHNldCBuYW1lIG1heSANCisgICAgICogbm90IGJlIGtub3duIHRvIHRoZSBWTSBldmVuIGlmIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4uDQorICAgICAqIFVzZSB7QGxpbmsgI3RvSmF2YUNoYXJzZXQoU3RyaW5nKX0gdG8gZ2V0IHRoZSBjYW5vbmljYWwgSmF2YSBjaGFyYWN0ZXINCisgICAgICogc2V0IG5hbWUuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gY2hhcnNldE5hbWUgdGhlIGNoYXJhY3RlcnMgc2V0IG5hbWUuDQorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZGVjb2RpbmcgaXMgc3VwcG9ydGVkLCA8Y29kZT5mYWxzZTwvY29kZT4NCisgICAgICogICAgICAgICBvdGhlcndpc2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWNvZGluZ1N1cHBvcnRlZChTdHJpbmcgY2hhcnNldE5hbWUpIHsNCisgICAgICAgIHJldHVybiBkZWNvZGluZ1N1cHBvcnRlZC5jb250YWlucyhjaGFyc2V0TmFtZS50b0xvd2VyQ2FzZSgpKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIEdldHMgdGhlIHByZWZlcnJlZCBNSU1FIGNoYXJhY3RlciBzZXQgbmFtZSBmb3IgdGhlIHNwZWNpZmllZA0KKyAgICAgKiBjaGFyYWN0ZXIgc2V0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bi4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBjaGFyc2V0TmFtZSB0aGUgY2hhcmFjdGVyIHNldCBuYW1lIHRvIGxvb2sgZm9yLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBNSU1FIHByZWZlcnJlZCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBrbm93bi4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTWltZUNoYXJzZXQoU3RyaW5nIGNoYXJzZXROYW1lKSB7DQorICAgICAgICBDaGFyc2V0IGMgPSBjaGFyc2V0TWFwLmdldChjaGFyc2V0TmFtZS50b0xvd2VyQ2FzZSgpKTsNCisgICAgICAgIGlmIChjICE9IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gYy5taW1lOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIG51bGw7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBHZXRzIHRoZSBjYW5vbmljYWwgSmF2YSBjaGFyYWN0ZXIgc2V0IG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQNCisgICAgICogY2hhcmFjdGVyIHNldCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Qga25vd24uIFRoaXMgc2hvdWxkIGJlDQorICAgICAqIGNhbGxlZCBiZWZvcmUgZG9pbmcgYW55IGNvbnZlcnNpb25zIHVzaW5nIHRoZSBKYXZhIEFQSS4gTk9URToNCisgICAgICogeW91IG11c3QgdXNlIHtAbGluayAjaXNFbmNvZGluZ1N1cHBvcnRlZChTdHJpbmcpfSBvcg0KKyAgICAgKiB7QGxpbmsgI2lzRGVjb2RpbmdTdXBwb3J0ZWQoU3RyaW5nKX0gdG8gbWFrZSBzdXJlIHRoZSByZXR1cm5lZA0KKyAgICAgKiBKYXZhIGNoYXJhY3RlciBzZXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IFZNLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGNoYXJzZXROYW1lIHRoZSBjaGFyYWN0ZXIgc2V0IG5hbWUgdG8gbG9vayBmb3IuDQorICAgICAqIEByZXR1cm4gdGhlIGNhbm9uaWNhbCBKYXZhIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGtub3duLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQ2hhcnNldChTdHJpbmcgY2hhcnNldE5hbWUpIHsNCisgICAgICAgIENoYXJzZXQgYyA9IGNoYXJzZXRNYXAuZ2V0KGNoYXJzZXROYW1lLnRvTG93ZXJDYXNlKCkpOw0KKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJldHVybiBjLmNhbm9uaWNhbDsNCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiBudWxsOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IGdldENoYXJzZXQoU3RyaW5nIGNoYXJzZXROYW1lKSB7DQorICAgICAgICBTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSAiSVNPLTg4NTktMSI7DQorICAgICAgICANCisgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBjaGFyZXNldCBpZiBnaXZlbiBjaGFyc2V0IGlzIG51bGwNCisgICAgICAgIGlmKGNoYXJzZXROYW1lID09IG51bGwpIGNoYXJzZXROYW1lID0gZGVmYXVsdENoYXJzZXQ7DQorICAgICAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHJldHVybiBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuZm9yTmFtZShjaGFyc2V0TmFtZSk7DQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgIGxvZy5pbmZvKCJJbGxlZ2FsIGNoYXJzZXQgIiArIGNoYXJzZXROYW1lICsgIiwgZmFsbGJhY2sgdG8gIiArIGRlZmF1bHRDaGFyc2V0ICsgIjogIiArIGUpOw0KKyAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IGNoYXJzZXQgb24gZXhjZXB0aW9uIA0KKyAgICAgICAgICAgIHJldHVybiBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQuZm9yTmFtZShkZWZhdWx0Q2hhcnNldCk7DQorICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsNCisgICAgICAgICAgICBsb2cuaW5mbygiVW5zdXBwb3J0ZWQgY2hhcnNldCAiICsgY2hhcnNldE5hbWUgKyAiLCBmYWxsYmFjayB0byAiICsgZGVmYXVsdENoYXJzZXQgKyAiOiAiICsgZXgpOw0KKyAgICAgICAgICAgIC8vIFVzZSBkZWZhdWx0IGNoYXJzZXQgb24gZXhjZXB0aW9uDQorICAgICAgICAgICAgcmV0dXJuIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldC5mb3JOYW1lKGRlZmF1bHRDaGFyc2V0KTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICB9DQorICAgIC8qDQorICAgICAqIFVuY29tbWVudCB0aGUgY29kZSBiZWxvdyBhbmQgcnVuIHRoZSBtYWluIG1ldGhvZCB0byByZWdlbmVyYXRlIHRoZQ0KKyAgICAgKiBKYXZhZG9jIHRhYmxlIGFib3ZlIHdoZW4gdGhlIGtub3duIGNoYXJzZXRzIGNoYW5nZS4gDQorICAgICAqLw0KKyAgICANCisgICAgLyoNCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGR1bXBIdG1sVGFibGUoKSB7DQorICAgICAgICBMaXN0PENoYXJzZXQ+IGwgPSBuZXcgTGlua2VkTGlzdDxDaGFyc2V0PihBcnJheXMuYXNMaXN0KEpBVkFfQ0hBUlNFVFMpKTsNCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobCk7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIHNiLmFwcGVuZCgiICogPHRhYmxlPlxuIik7DQorICAgICAgICBzYi5hcHBlbmQoIiAqICAgICA8dHI+XG4iKTsNCisgICAgICAgIHNiLmFwcGVuZCgiICogICAgICAgICA8dGQ+Q2Fub25pY2FsIChKYXZhKSBuYW1lPC90ZD5cbiIpOw0KKyAgICAgICAgc2IuYXBwZW5kKCIgKiAgICAgICAgIDx0ZD5NSU1FIHByZWZlcnJlZDwvdGQ+XG4iKTsNCisgICAgICAgIHNiLmFwcGVuZCgiICogICAgICAgICA8dGQ+QWxpYXNlczwvdGQ+XG4iKTsNCisgICAgICAgIHNiLmFwcGVuZCgiICogICAgIDwvdHI+XG4iKTsNCisNCisgICAgICAgIGZvciAoQ2hhcnNldCBjIDogbCkgew0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICogICAgIDx0cj5cbiIpOw0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICogICAgICAgICA8dGQ+IiArIGMuY2Fub25pY2FsICsgIjwvdGQ+XG4iKTsNCisgICAgICAgICAgICBzYi5hcHBlbmQoIiAqICAgICAgICAgPHRkPiIgKyAoYy5taW1lID09IG51bGwgPyAiPyIgOiBjLm1pbWUpKyAiPC90ZD5cbiIpOw0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICogICAgICAgICA8dGQ+Iik7DQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGMuYWxpYXNlcyAhPSBudWxsICYmIGkgPCBjLmFsaWFzZXMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMuYWxpYXNlc1tpXSArICIgIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC90ZD5cbiIpOw0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICogICAgIDwvdHI+XG4iKTsNCisgICAgICAgIH0NCisgICAgICAgIHNiLmFwcGVuZCgiICogPC90YWJsZT5cbiIpOw0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsNCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihkdW1wSHRtbFRhYmxlKCkpOw0KKyAgICB9DQorICAgICovDQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovdXRpbC9Db250ZW50VXRpbC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL0NvbnRlbnRVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5ZTI2MQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovdXRpbC9Db250ZW50VXRpbC5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWw7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgY29udmVydGluZyB0ZXh0dWFsIGNvbnRlbnQgb2YgYSBtZXNzYWdlLgorICovCitwdWJsaWMgY2xhc3MgQ29udGVudFV0aWwgeworCisgICAgcHJpdmF0ZSBDb250ZW50VXRpbCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYW4gaW1tdXRhYmxlIHNlcXVlbmNlIG9mIGJ5dGVzIHVzaW5nCisgICAgICogdGhlIFVTLUFTQ0lJIGNoYXJzZXQuCisgICAgICogCisgICAgICogQHBhcmFtIHN0cmluZworICAgICAqICAgICAgICAgICAgc3RyaW5nIHRvIGVuY29kZS4KKyAgICAgKiBAcmV0dXJuIGVuY29kZWQgc3RyaW5nIGFzIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSBvZiBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTZXF1ZW5jZSBlbmNvZGUoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gZW5jb2RlKENoYXJzZXRVdGlsLlVTX0FTQ0lJLCBzdHJpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW50byBhbiBpbW11dGFibGUgc2VxdWVuY2Ugb2YgYnl0ZXMgdXNpbmcKKyAgICAgKiB0aGUgc3BlY2lmaWVkIGNoYXJzZXQuCisgICAgICogCisgICAgICogQHBhcmFtIGNoYXJzZXQKKyAgICAgKiAgICAgICAgICAgIEphdmEgY2hhcnNldCB0byBiZSB1c2VkIGZvciB0aGUgY29udmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gc3RyaW5nCisgICAgICogICAgICAgICAgICBzdHJpbmcgdG8gZW5jb2RlLgorICAgICAqIEByZXR1cm4gZW5jb2RlZCBzdHJpbmcgYXMgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIG9mIGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNlcXVlbmNlIGVuY29kZShDaGFyc2V0IGNoYXJzZXQsIFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBlbmNvZGVkID0gY2hhcnNldC5lbmNvZGUoQ2hhckJ1ZmZlci53cmFwKHN0cmluZykpOworICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYmFiID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcihlbmNvZGVkLnJlbWFpbmluZygpKTsKKyAgICAgICAgYmFiLmFwcGVuZChlbmNvZGVkLmFycmF5KCksIGVuY29kZWQucG9zaXRpb24oKSwgZW5jb2RlZC5yZW1haW5pbmcoKSk7CisgICAgICAgIHJldHVybiBiYWI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyB0aGUgc3BlY2lmaWVkIHNlcXVlbmNlIG9mIGJ5dGVzIGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIFVTLUFTQ0lJCisgICAgICogY2hhcnNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gYnl0ZVNlcXVlbmNlCisgICAgICogICAgICAgICAgICBzZXF1ZW5jZSBvZiBieXRlcyB0byBkZWNvZGUuCisgICAgICogQHJldHVybiBkZWNvZGVkIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoQnl0ZVNlcXVlbmNlIGJ5dGVTZXF1ZW5jZSkgeworICAgICAgICByZXR1cm4gZGVjb2RlKENoYXJzZXRVdGlsLlVTX0FTQ0lJLCBieXRlU2VxdWVuY2UsIDAsIGJ5dGVTZXF1ZW5jZQorICAgICAgICAgICAgICAgIC5sZW5ndGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyB0aGUgc3BlY2lmaWVkIHNlcXVlbmNlIG9mIGJ5dGVzIGludG8gYSBzdHJpbmcgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAqIGNoYXJzZXQuCisgICAgICogCisgICAgICogQHBhcmFtIGNoYXJzZXQKKyAgICAgKiAgICAgICAgICAgIEphdmEgY2hhcnNldCB0byBiZSB1c2VkIGZvciB0aGUgY29udmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gYnl0ZVNlcXVlbmNlCisgICAgICogICAgICAgICAgICBzZXF1ZW5jZSBvZiBieXRlcyB0byBkZWNvZGUuCisgICAgICogQHJldHVybiBkZWNvZGVkIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoQ2hhcnNldCBjaGFyc2V0LCBCeXRlU2VxdWVuY2UgYnl0ZVNlcXVlbmNlKSB7CisgICAgICAgIHJldHVybiBkZWNvZGUoY2hhcnNldCwgYnl0ZVNlcXVlbmNlLCAwLCBieXRlU2VxdWVuY2UubGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgYSBzdWItc2VxdWVuY2Ugb2YgdGhlIHNwZWNpZmllZCBzZXF1ZW5jZSBvZiBieXRlcyBpbnRvIGEgc3RyaW5nCisgICAgICogdXNpbmcgdGhlIFVTLUFTQ0lJIGNoYXJzZXQuCisgICAgICogCisgICAgICogQHBhcmFtIGJ5dGVTZXF1ZW5jZQorICAgICAqICAgICAgICAgICAgc2VxdWVuY2Ugb2YgYnl0ZXMgdG8gZGVjb2RlLgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBieXRlIHNlcXVlbmNlLgorICAgICAqIEBwYXJhbSBsZW5ndGgKKyAgICAgKiAgICAgICAgICAgIG51bWJlciBvZiBieXRlcy4KKyAgICAgKiBAcmV0dXJuIGRlY29kZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShCeXRlU2VxdWVuY2UgYnl0ZVNlcXVlbmNlLCBpbnQgb2Zmc2V0LAorICAgICAgICAgICAgaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gZGVjb2RlKENoYXJzZXRVdGlsLlVTX0FTQ0lJLCBieXRlU2VxdWVuY2UsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGVzIGEgc3ViLXNlcXVlbmNlIG9mIHRoZSBzcGVjaWZpZWQgc2VxdWVuY2Ugb2YgYnl0ZXMgaW50byBhIHN0cmluZworICAgICAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2hhcnNldC4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gY2hhcnNldAorICAgICAqICAgICAgICAgICAgSmF2YSBjaGFyc2V0IHRvIGJlIHVzZWQgZm9yIHRoZSBjb252ZXJzaW9uLgorICAgICAqIEBwYXJhbSBieXRlU2VxdWVuY2UKKyAgICAgKiAgICAgICAgICAgIHNlcXVlbmNlIG9mIGJ5dGVzIHRvIGRlY29kZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICBvZmZzZXQgaW50byB0aGUgYnl0ZSBzZXF1ZW5jZS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoCisgICAgICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMuCisgICAgICogQHJldHVybiBkZWNvZGVkIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoQ2hhcnNldCBjaGFyc2V0LCBCeXRlU2VxdWVuY2UgYnl0ZVNlcXVlbmNlLAorICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgeworICAgICAgICBpZiAoYnl0ZVNlcXVlbmNlIGluc3RhbmNlb2YgQnl0ZUFycmF5QnVmZmVyKSB7CisgICAgICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYmFiID0gKEJ5dGVBcnJheUJ1ZmZlcikgYnl0ZVNlcXVlbmNlOworICAgICAgICAgICAgcmV0dXJuIGRlY29kZShjaGFyc2V0LCBiYWIuYnVmZmVyKCksIG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGJ5dGVTZXF1ZW5jZS50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgcmV0dXJuIGRlY29kZShjaGFyc2V0LCBieXRlcywgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZShDaGFyc2V0IGNoYXJzZXQsIGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsCisgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBjaGFyc2V0LmRlY29kZShCeXRlQnVmZmVyLndyYXAoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvRW1wdHlCeXRlU2VxdWVuY2UuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovdXRpbC9FbXB0eUJ5dGVTZXF1ZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxY2RkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvRW1wdHlCeXRlU2VxdWVuY2UuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWw7CisKK2ZpbmFsIGNsYXNzIEVtcHR5Qnl0ZVNlcXVlbmNlIGltcGxlbWVudHMgQnl0ZVNlcXVlbmNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfQllURVMgPSB7fTsKKworICAgIHB1YmxpYyBpbnQgbGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgYnl0ZSBieXRlQXQoaW50IGluZGV4KSB7CisgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIEVNUFRZX0JZVEVTOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvTWltZVV0aWwuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovdXRpbC9NaW1lVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4N2I5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvTWltZVV0aWwuamF2YQpAQCAtMCwwICsxLDU0NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbDsNCisNCitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7DQoraW1wb3J0IGphdmEudGV4dC5GaWVsZFBvc2l0aW9uOw0KK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsNCitpbXBvcnQgamF2YS51dGlsLkRhdGU7DQoraW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5SYW5kb207DQoraW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2dGYWN0b3J5Ow0KKw0KKy8qKg0KKyAqIEEgdXRpbGl0eSBjbGFzcywgd2hpY2ggcHJvdmlkZXMgc29tZSBNSU1FIHJlbGF0ZWQgYXBwbGljYXRpb24gbG9naWMuDQorICovDQorcHVibGljIGZpbmFsIGNsYXNzIE1pbWVVdGlsIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nIGxvZyA9IExvZ0ZhY3RvcnkuZ2V0TG9nKE1pbWVVdGlsLmNsYXNzKTsNCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBUaGUgPGNvZGU+cXVvdGVkLXByaW50YWJsZTwvY29kZT4gZW5jb2RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNfUVVPVEVEX1BSSU5UQUJMRSA9ICJxdW90ZWQtcHJpbnRhYmxlIjsNCisgICAgLyoqDQorICAgICAqIFRoZSA8Y29kZT5iaW5hcnk8L2NvZGU+IGVuY29kaW5nLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DX0JJTkFSWSA9ICJiaW5hcnkiOw0KKyAgICAvKioNCisgICAgICogVGhlIDxjb2RlPmJhc2U2NDwvY29kZT4gZW5jb2RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNfQkFTRTY0ID0gImJhc2U2NCI7DQorICAgIC8qKg0KKyAgICAgKiBUaGUgPGNvZGU+OGJpdDwvY29kZT4gZW5jb2RpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNfOEJJVCA9ICI4Yml0IjsNCisgICAgLyoqDQorICAgICAqIFRoZSA8Y29kZT43Yml0PC9jb2RlPiBlbmNvZGluZy4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ183QklUID0gIjdiaXQiOw0KKw0KKyAgICAvKiogPGNvZGU+TUlNRS1WZXJzaW9uPC9jb2RlPiBoZWFkZXIgbmFtZSAobG93ZXJjYXNlKSAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0hFQURFUl9NSU1FX1ZFUlNJT04gPSAibWltZS12ZXJzaW9uIjsNCisgICAgLyoqIDxjb2RlPkNvbnRlbnQtSUQ8L2NvZGU+IGhlYWRlciBuYW1lIChsb3dlcmNhc2UpICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfSEVBREVSX0NPTlRFTlRfSUQgPSAiY29udGVudC1pZCI7DQorICAgIC8qKiA8Y29kZT5Db250ZW50LURlc2NyaXB0aW9uPC9jb2RlPiBoZWFkZXIgbmFtZSAobG93ZXJjYXNlKSAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0hFQURFUl9DT05URU5UX0RFU0NSSVBUSU9OID0gImNvbnRlbnQtZGVzY3JpcHRpb24iOw0KKyAgICAvKiogDQorICAgICAqIDxjb2RlPkNvbnRlbnQtRGlzcG9zaXRpb248L2NvZGU+IGhlYWRlciBuYW1lIChsb3dlcmNhc2UpLiANCisgICAgICogU2VlIDxhIGhyZWY9J2h0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMyMTgzLmh0bWwnPlJGQzIxODM8L2E+LiANCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfSEVBREVSX0NPTlRFTlRfRElTUE9TSVRJT04gPSAiY29udGVudC1kaXNwb3NpdGlvbiI7DQorICAgIC8qKiANCisgICAgICogPGNvZGU+Q29udGVudC1EaXNwb3NpdGlvbjwvY29kZT4gZmlsZW5hbWUgcGFyYW1ldGVyIChsb3dlcmNhc2UpLiANCisgICAgICogU2VlIDxhIGhyZWY9J2h0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMyMTgzLmh0bWwnPlJGQzIxODM8L2E+LiANCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0ZJTEVOQU1FID0gImZpbGVuYW1lIjsNCisgICAgLyoqIA0KKyAgICAgKiA8Y29kZT5Db250ZW50LURpc3Bvc2l0aW9uPC9jb2RlPiBtb2RpZmljYXRpb24tZGF0ZSBwYXJhbWV0ZXIgKGxvd2VyY2FzZSkuIA0KKyAgICAgKiBTZWUgPGEgaHJlZj0naHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzIxODMuaHRtbCc+UkZDMjE4MzwvYT4uIA0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fTU9ESUZJQ0FUSU9OX0RBVEUgPSAibW9kaWZpY2F0aW9uLWRhdGUiOw0KKyAgICAvKiogDQorICAgICAqIDxjb2RlPkNvbnRlbnQtRGlzcG9zaXRpb248L2NvZGU+IGNyZWF0aW9uLWRhdGUgcGFyYW1ldGVyIChsb3dlcmNhc2UpLiANCisgICAgICogU2VlIDxhIGhyZWY9J2h0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMyMTgzLmh0bWwnPlJGQzIxODM8L2E+LiANCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NSRUFUSU9OX0RBVEUgPSAiY3JlYXRpb24tZGF0ZSI7DQorICAgIC8qKiANCisgICAgICogPGNvZGU+Q29udGVudC1EaXNwb3NpdGlvbjwvY29kZT4gcmVhZC1kYXRlIHBhcmFtZXRlciAobG93ZXJjYXNlKS4gDQorICAgICAqIFNlZSA8YSBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjE4My5odG1sJz5SRkMyMTgzPC9hPi4gDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9SRUFEX0RBVEUgPSAicmVhZC1kYXRlIjsNCisgICAgLyoqIA0KKyAgICAgKiA8Y29kZT5Db250ZW50LURpc3Bvc2l0aW9uPC9jb2RlPiBzaXplIHBhcmFtZXRlciAobG93ZXJjYXNlKS4gDQorICAgICAqIFNlZSA8YSBocmVmPSdodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjE4My5odG1sJz5SRkMyMTgzPC9hPi4gDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TSVpFID0gInNpemUiOw0KKyAgICAvKioNCisgICAgICogPGNvZGU+Q29udGVudC1MYW5nYXVnZTwvY29kZT4gaGVhZGVyIChsb3dlciBjYXNlKS4NCisgICAgICogU2VlIDxhIGhyZWY9J2h0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmM0NjQ2Lmh0bWwnPlJGQzQ2NDY8L2E+Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9IRUFERVJfTEFOR0FVR0UgPSAiY29udGVudC1sYW5ndWFnZSI7DQorICAgIC8qKg0KKyAgICAgKiA8Y29kZT5Db250ZW50LUxvY2F0aW9uPC9jb2RlPiBoZWFkZXIgKGxvd2VyIGNhc2UpLg0KKyAgICAgKiBTZWUgPGEgaHJlZj0naHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzI1NTcuaHRtbCc+UkZDMjU1NzwvYT4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0hFQURFUl9MT0NBVElPTiA9ICJjb250ZW50LWxvY2F0aW9uIjsNCisgICAgLyoqDQorICAgICAqIDxjb2RlPkNvbnRlbnQtTUQ1PC9jb2RlPiBoZWFkZXIgKGxvd2VyIGNhc2UpLg0KKyAgICAgKiBTZWUgPGEgaHJlZj0naHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzE4NjQuaHRtbCc+UkZDMTg2NDwvYT4uDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX0hFQURFUl9NRDUgPSAiY29udGVudC1tZDUiOw0KKw0KKyAgICAvLyB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgaWRzDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7DQorICAgIA0KKyAgICAvLyB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgaWRzDQorICAgIHByaXZhdGUgc3RhdGljIGludCBjb3VudGVyID0gMDsNCisNCisgICAgcHJpdmF0ZSBNaW1lVXRpbCgpIHsNCisgICAgICAgIC8vIHRoaXMgaXMgYW4gdXRpbGl0eSBjbGFzcyB0byBiZSB1c2VkIHN0YXRpY2FsbHkuDQorICAgICAgICAvLyB0aGlzIGNvbnN0cnVjdG9yIHByb3RlY3QgZnJvbSBpbnN0YW50aWF0aW9uLg0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogUmV0dXJucywgd2hldGhlciB0aGUgZ2l2ZW4gdHdvIE1JTUUgdHlwZXMgYXJlIGlkZW50aWNhbC4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NhbWVNaW1lVHlwZShTdHJpbmcgcFR5cGUxLCBTdHJpbmcgcFR5cGUyKSB7DQorICAgICAgICByZXR1cm4gcFR5cGUxICE9IG51bGwgICYmICBwVHlwZTIgIT0gbnVsbCAgJiYgIHBUeXBlMS5lcXVhbHNJZ25vcmVDYXNlKHBUeXBlMik7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdHJ1ZSwgaWYgdGhlIGdpdmVuIE1JTUUgdHlwZSBpcyB0aGF0IG9mIGEgbWVzc2FnZS4gDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXNzYWdlKFN0cmluZyBwTWltZVR5cGUpIHsNCisgICAgICAgIHJldHVybiBwTWltZVR5cGUgIT0gbnVsbCAgJiYgIHBNaW1lVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJtZXNzYWdlL3JmYzgyMiIpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm4gdHJ1ZSwgaWYgdGhlIGdpdmVuIE1JTUUgdHlwZSBpbmRpY2F0ZXMgYSBtdWx0aXBhcnQgZW50aXR5Lg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTXVsdGlwYXJ0KFN0cmluZyBwTWltZVR5cGUpIHsNCisgICAgICAgIHJldHVybiBwTWltZVR5cGUgIT0gbnVsbCAgJiYgIHBNaW1lVHlwZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoIm11bHRpcGFydC8iKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucywgd2hldGhlciB0aGUgZ2l2ZW4gdHJhbnNmZXItZW5jb2RpbmcgaXMgImJhc2U2NCIuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCYXNlNjRFbmNvZGluZyhTdHJpbmcgcFRyYW5zZmVyRW5jb2RpbmcpIHsNCisgICAgICAgIHJldHVybiBFTkNfQkFTRTY0LmVxdWFsc0lnbm9yZUNhc2UocFRyYW5zZmVyRW5jb2RpbmcpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zLCB3aGV0aGVyIHRoZSBnaXZlbiB0cmFuc2Zlci1lbmNvZGluZyBpcyAicXVvdGVkLXByaW50YWJsZSIuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWRQcmludGFibGVFbmNvZGVkKFN0cmluZyBwVHJhbnNmZXJFbmNvZGluZykgew0KKyAgICAgICAgcmV0dXJuIEVOQ19RVU9URURfUFJJTlRBQkxFLmVxdWFsc0lnbm9yZUNhc2UocFRyYW5zZmVyRW5jb2RpbmcpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiA8cD5QYXJzZXMgYSBjb21wbGV4IGZpZWxkIHZhbHVlIGludG8gYSBtYXAgb2Yga2V5L3ZhbHVlIHBhaXJzLiBZb3UgbWF5DQorICAgICAqIHVzZSB0aGlzLCBmb3IgZXhhbXBsZSwgdG8gcGFyc2UgYSBkZWZpbml0aW9uIGxpa2UNCisgICAgICogPHByZT4NCisgICAgICogICB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04OyBib3VuZGFyeT1mb29iYXINCisgICAgICogPC9wcmU+DQorICAgICAqIFRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHJldHVybiBhIG1hcCB3aXRoIHRoZSBrZXlzICIiLCAiY2hhcnNldCIsDQorICAgICAqIGFuZCAiYm91bmRhcnkiLCBhbmQgdGhlIHZhbHVlcyAidGV4dC9wbGFpbiIsICJVVEYtOCIsIGFuZCAiZm9vYmFyIi4NCisgICAgICogPC9wPjxwPg0KKyAgICAgKiBIZWFkZXIgdmFsdWUgd2lsbCBiZSB1bmZvbGRlZCBhbmQgZXhjZXNzIHdoaXRlIHNwYWNlIHRyaW1tZWQuDQorICAgICAqIDwvcD4NCisgICAgICogQHBhcmFtIHBWYWx1ZSBUaGUgZmllbGQgdmFsdWUgdG8gcGFyc2UuDQorICAgICAqIEByZXR1cm4gVGhlIHJlc3VsdCBtYXA7IHVzZSB0aGUga2V5ICIiIHRvIHJldHJpZXZlIHRoZSBmaXJzdCB2YWx1ZS4NCisgICAgICovDQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJmYWxsdGhyb3VnaCIpDQorICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRIZWFkZXJQYXJhbXMoU3RyaW5nIHBWYWx1ZSkgew0KKyAgICAgICAgcFZhbHVlID0gcFZhbHVlLnRyaW0oKTsNCisNCisgICAgICAgIHBWYWx1ZSA9IHVuZm9sZChwVmFsdWUpOw0KKyAgICAgICAgDQorICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOw0KKw0KKyAgICAgICAgLy8gc3BsaXQgbWFpbiB2YWx1ZSBhbmQgcGFyYW1ldGVycw0KKyAgICAgICAgU3RyaW5nIG1haW47DQorICAgICAgICBTdHJpbmcgcmVzdDsNCisgICAgICAgIGlmIChwVmFsdWUuaW5kZXhPZigiOyIpID09IC0xKSB7DQorICAgICAgICAgICAgbWFpbiA9IHBWYWx1ZTsNCisgICAgICAgICAgICByZXN0ID0gbnVsbDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgbWFpbiA9IHBWYWx1ZS5zdWJzdHJpbmcoMCwgcFZhbHVlLmluZGV4T2YoIjsiKSk7DQorICAgICAgICAgICAgcmVzdCA9IHBWYWx1ZS5zdWJzdHJpbmcobWFpbi5sZW5ndGgoKSArIDEpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcmVzdWx0LnB1dCgiIiwgbWFpbik7DQorICAgICAgICBpZiAocmVzdCAhPSBudWxsKSB7DQorICAgICAgICAgICAgY2hhcltdIGNoYXJzID0gcmVzdC50b0NoYXJBcnJheSgpOw0KKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcGFyYW1OYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIoNjQpOw0KKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcGFyYW1WYWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKDY0KTsNCisNCisgICAgICAgICAgICBmaW5hbCBieXRlIFJFQURZX0ZPUl9OQU1FID0gMDsNCisgICAgICAgICAgICBmaW5hbCBieXRlIElOX05BTUUgPSAxOw0KKyAgICAgICAgICAgIGZpbmFsIGJ5dGUgUkVBRFlfRk9SX1ZBTFVFID0gMjsNCisgICAgICAgICAgICBmaW5hbCBieXRlIElOX1ZBTFVFID0gMzsNCisgICAgICAgICAgICBmaW5hbCBieXRlIElOX1FVT1RFRF9WQUxVRSA9IDQ7DQorICAgICAgICAgICAgZmluYWwgYnl0ZSBWQUxVRV9ET05FID0gNTsNCisgICAgICAgICAgICBmaW5hbCBieXRlIEVSUk9SID0gOTk7DQorDQorICAgICAgICAgICAgYnl0ZSBzdGF0ZSA9IFJFQURZX0ZPUl9OQU1FOw0KKyAgICAgICAgICAgIGJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOw0KKyAgICAgICAgICAgIGZvciAoY2hhciBjIDogY2hhcnMpIHsNCisgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgew0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUjoNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnOycpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gUkVBRFlfRk9SX05BTUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgICBjYXNlIFJFQURZX0ZPUl9OQU1FOg0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICc9Jykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IoIkV4cGVjdGVkIGhlYWRlciBwYXJhbSBuYW1lLCBnb3QgJz0nIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gRVJST1I7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUuc2V0TGVuZ3RoKDApOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUuc2V0TGVuZ3RoKDApOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fTkFNRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gNCisNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5fTkFNRToNCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnPScpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtTmFtZS5sZW5ndGgoKSA9PSAwKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBFUlJPUjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBSRUFEWV9GT1JfVkFMVUU7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgJz0nLi4uIGp1c3QgYWRkIHRvIG5hbWUNCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUuYXBwZW5kKGMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUFEWV9GT1JfVkFMVUU6DQorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmYWxsVGhyb3VnaCA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgew0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBpZ25vcmUgc3BhY2VzLCBlc3BlY2lhbGx5IGJlZm9yZSAnIicNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX1FVT1RFRF9WQUxVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBJTl9WQUxVRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxUaHJvdWdoID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZhbGxUaHJvdWdoKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisNCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gNCisNCisgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5fVkFMVUU6DQorICAgICAgICAgICAgICAgICAgICAgICAgZmFsbFRocm91Z2ggPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOyc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyAnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcdCc6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gVkFMVUVfRE9ORTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxUaHJvdWdoID0gdHJ1ZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZS5hcHBlbmQoYyk7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmYWxsVGhyb3VnaCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgICBjYXNlIFZBTFVFX0RPTkU6DQorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzsnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBSRUFEWV9GT1JfTkFNRTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcgJzoNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXHQnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVSUk9SOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBJTl9RVU9URURfVkFMVUU6DQorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyInOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlc2NhcGVkKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgdHJpbSBxdW90ZWQgc3RyaW5nczsgdGhlIHNwYWNlcyBjb3VsZCBiZSBpbnRlbnRpb25hbC4NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHV0KA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lLnRvU3RyaW5nKCkudHJpbSgpLnRvTG93ZXJDYXNlKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlLnRvU3RyaW5nKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gVkFMVUVfRE9ORTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUuYXBwZW5kKGMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlLmFwcGVuZCgnXFwnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZDsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlLmFwcGVuZCgnXFwnKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSBmYWxzZTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUuYXBwZW5kKGMpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIC8vIGRvbmUgbG9vcGluZy4gIGNoZWNrIGlmIGFueXRoaW5nIGlzIGxlZnQgb3Zlci4NCisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gSU5fVkFMVUUpIHsNCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dCgNCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKSwNCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlLnRvU3RyaW5nKCkudHJpbSgpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gcmVzdWx0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSBtZXNzYWdlIGJvdW5kYXJ5IHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGJvdW5kYXJ5DQorICAgICAqIHBhcmFtZXRlciBmb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgZmllbGQgb2YgYSBtZXNzYWdlLg0KKyAgICAgKiANCisgICAgICogQHJldHVybiBhIG5ldyB1bmlxdWUgbWVzc2FnZSBib3VuZGFyeSBzdHJpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVbmlxdWVCb3VuZGFyeSgpIHsNCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KKyAgICAgICAgc2IuYXBwZW5kKCItPVBhcnQuIik7DQorICAgICAgICBzYi5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhuZXh0Q291bnRlclZhbHVlKCkpKTsNCisgICAgICAgIHNiLmFwcGVuZCgnLicpOw0KKyAgICAgICAgc2IuYXBwZW5kKExvbmcudG9IZXhTdHJpbmcocmFuZG9tLm5leHRMb25nKCkpKTsNCisgICAgICAgIHNiLmFwcGVuZCgnLicpOw0KKyAgICAgICAgc2IuYXBwZW5kKExvbmcudG9IZXhTdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsNCisgICAgICAgIHNiLmFwcGVuZCgnLicpOw0KKyAgICAgICAgc2IuYXBwZW5kKExvbmcudG9IZXhTdHJpbmcocmFuZG9tLm5leHRMb25nKCkpKTsNCisgICAgICAgIHNiLmFwcGVuZCgiPS0iKTsNCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHVuaXF1ZSBtZXNzYWdlIGlkZW50aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiBtZXNzYWdlDQorICAgICAqIGhlYWRlciBmaWVsZCBzdWNoIGFzIE1lc3NhZ2UtSUQgb3IgSW4tUmVwbHktVG8uIElmIHRoZSBnaXZlbiBob3N0IG5hbWUgaXMNCisgICAgICogbm90IDxjb2RlPm51bGw8L2NvZGU+IGl0IHdpbGwgYmUgdXNlZCBhcyBzdWZmaXggZm9yIHRoZSBtZXNzYWdlIElEDQorICAgICAqIChmb2xsb3dpbmcgYW4gYXQgc2lnbikuDQorICAgICAqIA0KKyAgICAgKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBlbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0cyAoJmx0OyBhbmQgJmd0Oyk7DQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gaG9zdE5hbWUgaG9zdCBuYW1lIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBtZXNzYWdlIElEIG9yDQorICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaG9zdCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZC4NCisgICAgICogQHJldHVybiBhIG5ldyB1bmlxdWUgbWVzc2FnZSBpZGVudGlmaWVyLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVW5pcXVlTWVzc2FnZUlkKFN0cmluZyBob3N0TmFtZSkgew0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCI8TWltZTRqLiIpOw0KKyAgICAgICAgc2IuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcobmV4dENvdW50ZXJWYWx1ZSgpKSk7DQorICAgICAgICBzYi5hcHBlbmQoJy4nKTsNCisgICAgICAgIHNiLmFwcGVuZChMb25nLnRvSGV4U3RyaW5nKHJhbmRvbS5uZXh0TG9uZygpKSk7DQorICAgICAgICBzYi5hcHBlbmQoJy4nKTsNCisgICAgICAgIHNiLmFwcGVuZChMb25nLnRvSGV4U3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7DQorICAgICAgICBpZiAoaG9zdE5hbWUgIT0gbnVsbCkgew0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgnQCcpOw0KKyAgICAgICAgICAgIHNiLmFwcGVuZChob3N0TmFtZSk7DQorICAgICAgICB9DQorICAgICAgICBzYi5hcHBlbmQoJz4nKTsNCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgZGF0ZSBpbnRvIGEgUkZDIDgyMiBkYXRlLXRpbWUgc3RyaW5nLg0KKyAgICAgKiANCisgICAgICogQHBhcmFtIGRhdGUNCisgICAgICogICAgICAgICAgICBkYXRlIHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEgc3RyaW5nLg0KKyAgICAgKiBAcGFyYW0gem9uZQ0KKyAgICAgKiAgICAgICAgICAgIHRoZSB0aW1lIHpvbmUgdG8gdXNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHVzZSB0aGUgZGVmYXVsdA0KKyAgICAgKiAgICAgICAgICAgIHRpbWUgem9uZS4NCisgICAgICogQHJldHVybiB0aGUgZm9ybWF0dGVkIHRpbWUgc3RyaW5nLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0RGF0ZShEYXRlIGRhdGUsIFRpbWVab25lIHpvbmUpIHsNCisgICAgICAgIERhdGVGb3JtYXQgZGYgPSBSRkM4MjJfREFURV9GT1JNQVQuZ2V0KCk7DQorDQorICAgICAgICBpZiAoem9uZSA9PSBudWxsKSB7DQorICAgICAgICAgICAgZGYuc2V0VGltZVpvbmUoVGltZVpvbmUuZ2V0RGVmYXVsdCgpKTsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgZGYuc2V0VGltZVpvbmUoem9uZSk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gZGYuZm9ybWF0KGRhdGUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBTcGxpdHMgdGhlIHNwZWNpZmllZCBzdHJpbmcgaW50byBhIG11bHRpcGxlLWxpbmUgcmVwcmVzZW50YXRpb24gd2l0aA0KKyAgICAgKiBsaW5lcyBubyBsb25nZXIgdGhhbiA3NiBjaGFyYWN0ZXJzIChiZWNhdXNlIHRoZSBsaW5lIG1pZ2h0IGNvbnRhaW4NCisgICAgICogZW5jb2RlZCB3b3Jkczsgc2VlIDxhIGhyZWY9J2h0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMyMDQ3Lmh0bWwnPlJGQw0KKyAgICAgKiAyMDQ3PC9hPiBzZWN0aW9uIDIpLiBJZiB0aGUgc3RyaW5nIGNvbnRhaW5zIG5vbi13aGl0ZXNwYWNlIHNlcXVlbmNlcw0KKyAgICAgKiBsb25nZXIgdGhhbiA3NiBjaGFyYWN0ZXJzIGEgbGluZSBicmVhayBpcyBpbnNlcnRlZCBhdCB0aGUgd2hpdGVzcGFjZQ0KKyAgICAgKiBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSBzZXF1ZW5jZSByZXN1bHRpbmcgaW4gYSBsaW5lIGxvbmdlciB0aGFuIDc2DQorICAgICAqIGNoYXJhY3RlcnMuDQorICAgICAqIA0KKyAgICAgKiBAcGFyYW0gcw0KKyAgICAgKiAgICAgICAgICAgIHN0cmluZyB0byBzcGxpdC4NCisgICAgICogQHBhcmFtIHVzZWRDaGFyYWN0ZXJzDQorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYWxyZWFkeSB1c2VkIHVwLiBVc3VhbGx5IHRoZSBudW1iZXIgb2YNCisgICAgICogICAgICAgICAgICBjaGFyYWN0ZXJzIGZvciBoZWFkZXIgZmllbGQgbmFtZSBwbHVzIGNvbG9uIGFuZCBvbmUgc3BhY2UuDQorICAgICAqIEByZXR1cm4gYSBtdWx0aXBsZS1saW5lIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBzdHJpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb2xkKFN0cmluZyBzLCBpbnQgdXNlZENoYXJhY3RlcnMpIHsNCisgICAgICAgIGZpbmFsIGludCBtYXhDaGFyYWN0ZXJzID0gNzY7DQorDQorICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcy5sZW5ndGgoKTsNCisgICAgICAgIGlmICh1c2VkQ2hhcmFjdGVycyArIGxlbmd0aCA8PSBtYXhDaGFyYWN0ZXJzKQ0KKyAgICAgICAgICAgIHJldHVybiBzOw0KKw0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorDQorICAgICAgICBpbnQgbGFzdExpbmVCcmVhayA9IC11c2VkQ2hhcmFjdGVyczsNCisgICAgICAgIGludCB3c3BJZHggPSBpbmRleE9mV3NwKHMsIDApOw0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsNCisgICAgICAgICAgICBpZiAod3NwSWR4ID09IGxlbmd0aCkgew0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgbGFzdExpbmVCcmVhaykpKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGludCBuZXh0V3NwSWR4ID0gaW5kZXhPZldzcChzLCB3c3BJZHggKyAxKTsNCisNCisgICAgICAgICAgICBpZiAobmV4dFdzcElkeCAtIGxhc3RMaW5lQnJlYWsgPiBtYXhDaGFyYWN0ZXJzKSB7DQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzLnN1YnN0cmluZyhNYXRoLm1heCgwLCBsYXN0TGluZUJyZWFrKSwgd3NwSWR4KSk7DQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiXHJcbiIpOw0KKyAgICAgICAgICAgICAgICBsYXN0TGluZUJyZWFrID0gd3NwSWR4Ow0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICB3c3BJZHggPSBuZXh0V3NwSWR4Ow0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBVbmZvbGQgYSBtdWx0aXBsZS1saW5lIHJlcHJlc2VudGF0aW9uIGludG8gYSBzaW5nbGUgbGluZS4NCisgICAgICogDQorICAgICAqIEBwYXJhbSBzDQorICAgICAqICAgICAgICAgICAgc3RyaW5nIHRvIHVuZm9sZC4NCisgICAgICogQHJldHVybiB1bmZvbGRlZCBzdHJpbmcuDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmZvbGQoU3RyaW5nIHMpIHsNCisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzLmxlbmd0aCgpOw0KKyAgICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykgew0KKyAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGlkeCk7DQorICAgICAgICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpIHsNCisgICAgICAgICAgICAgICAgcmV0dXJuIHVuZm9sZDAocywgaWR4KTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gczsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdW5mb2xkMChTdHJpbmcgcywgaW50IGNybGZJZHgpIHsNCisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBzLmxlbmd0aCgpOw0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7DQorDQorICAgICAgICBpZiAoY3JsZklkeCA+IDApIHsNCisgICAgICAgICAgICBzYi5hcHBlbmQocy5zdWJzdHJpbmcoMCwgY3JsZklkeCkpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZm9yIChpbnQgaWR4ID0gY3JsZklkeCArIDE7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHsNCisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpZHgpOw0KKyAgICAgICAgICAgIGlmIChjICE9ICdccicgJiYgYyAhPSAnXG4nKSB7DQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZldzcChTdHJpbmcgcywgaW50IGZyb21JbmRleCkgew0KKyAgICAgICAgZmluYWwgaW50IGxlbiA9IHMubGVuZ3RoKCk7DQorICAgICAgICBmb3IgKGludCBpbmRleCA9IGZyb21JbmRleDsgaW5kZXggPCBsZW47IGluZGV4KyspIHsNCisgICAgICAgICAgICBjaGFyIGMgPSBzLmNoYXJBdChpbmRleCk7DQorICAgICAgICAgICAgaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykNCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGxlbjsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IG5leHRDb3VudGVyVmFsdWUoKSB7DQorICAgICAgICByZXR1cm4gY291bnRlcisrOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPERhdGVGb3JtYXQ+IFJGQzgyMl9EQVRFX0ZPUk1BVCA9IG5ldyBUaHJlYWRMb2NhbDxEYXRlRm9ybWF0PigpIHsNCisgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgcHJvdGVjdGVkIERhdGVGb3JtYXQgaW5pdGlhbFZhbHVlKCkgew0KKyAgICAgICAgICAgIHJldHVybiBuZXcgUmZjODIyRGF0ZUZvcm1hdCgpOw0KKyAgICAgICAgfQ0KKyAgICB9Ow0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZmM4MjJEYXRlRm9ybWF0IGV4dGVuZHMgU2ltcGxlRGF0ZUZvcm1hdCB7DQorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCisNCisgICAgICAgIHB1YmxpYyBSZmM4MjJEYXRlRm9ybWF0KCkgew0KKyAgICAgICAgICAgIHN1cGVyKCJFRUUsIGQgTU1NIHl5eXkgSEg6bW06c3MgIiwgTG9jYWxlLlVTKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXQoRGF0ZSBkYXRlLCBTdHJpbmdCdWZmZXIgdG9BcHBlbmRUbywNCisgICAgICAgICAgICAgICAgRmllbGRQb3NpdGlvbiBwb3MpIHsNCisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBzdXBlci5mb3JtYXQoZGF0ZSwgdG9BcHBlbmRUbywgcG9zKTsNCisNCisgICAgICAgICAgICBpbnQgem9uZU1pbGxpcyA9IGNhbGVuZGFyLmdldChHcmVnb3JpYW5DYWxlbmRhci5aT05FX09GRlNFVCk7DQorICAgICAgICAgICAgaW50IGRzdE1pbGxpcyA9IGNhbGVuZGFyLmdldChHcmVnb3JpYW5DYWxlbmRhci5EU1RfT0ZGU0VUKTsNCisgICAgICAgICAgICBpbnQgbWludXRlcyA9ICh6b25lTWlsbGlzICsgZHN0TWlsbGlzKSAvIDEwMDAgLyA2MDsNCisNCisgICAgICAgICAgICBpZiAobWludXRlcyA8IDApIHsNCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCctJyk7DQorICAgICAgICAgICAgICAgIG1pbnV0ZXMgPSAtbWludXRlczsNCisgICAgICAgICAgICB9IGVsc2Ugew0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJysnKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMmQlMDJkIiwgbWludXRlcyAvIDYwLCBtaW51dGVzICUgNjApKTsNCisNCisgICAgICAgICAgICByZXR1cm4gc2I7DQorICAgICAgICB9DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL1N0cmluZ0FycmF5TWFwLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvU3RyaW5nQXJyYXlNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzYzOWNlCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL1N0cmluZ0FycmF5TWFwLmphdmEKQEAgLTAsMCArMSwyNTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWw7DQorDQoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOw0KK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQoraW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOw0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLk1hcDsNCitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2UuSGVhZGVyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuQ29udGVudEhhbmRsZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5GaWVsZDsNCisNCisvKioNCisgKiBBbiBvYmplY3QsIHdoaWNoIG1heSBiZSB1c2VkIHRvIGltcGxlbWVudCBoZWFkZXIsIG9yIHBhcmFtZXRlcg0KKyAqIG1hcHMuIFRoZSBtYXBzIGtleXMgYXJlIHRoZSBoZWFkZXIgb3IgcGFyYW1ldGVyIG5hbWVzLiBUaGUNCisgKiBtYXBzIHZhbHVlcyBhcmUgc3RyaW5ncyAoc2luZ2xlIHZhbHVlKSwgbGlzdHMsIG9yIGFycmF5cy4NCisgKiA8cD4NCisgKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBub3QgZGlyZWN0bHkgdXNlZCBhbnl3aGVyZSBpbiBNaW1lNGouDQorICogSW5zdGVhZCBhIHVzZXIgbWlnaHQgY2hvb3NlIHRvIHVzZSBpdCBpbnN0ZWFkIG9mIHtAbGluayBIZWFkZXJ9DQorICogYW5kIHtAbGluayBGaWVsZH0gaW4gYSBjdXN0b20ge0BsaW5rIENvbnRlbnRIYW5kbGVyfSBpbXBsZW1lbnRhdGlvbi4NCisgKiBTZWUgYWxzbyBNSU1FNGotMjQuDQorICovDQorcHVibGljIGNsYXNzIFN0cmluZ0FycmF5TWFwIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU4MzMwNTExNjQyODE3ODY5MDdMOw0KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7DQorDQorICAgIC8qKg0KKyAgICAgKiA8cD5Db252ZXJ0cyB0aGUgZ2l2ZW4gb2JqZWN0IGludG8gYSBzdHJpbmcuIFRoZSBvYmplY3QgbWF5IGJlIGVpdGhlciBvZjoNCisgICAgICogPHVsPg0KKyAgICAgKiAgIDxsaT5hIHN0cmluZywgd2hpY2ggaXMgcmV0dXJuZWQgd2l0aG91dCBjb252ZXJzaW9uPC9saT4NCisgICAgICogICA8bGk+YSBsaXN0IG9mIHN0cmluZ3MsIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IGVsZW1lbnQgaXMgcmV0dXJuZWQ8L2xpPg0KKyAgICAgKiAgIDxsaT5hbiBhcnJheSBvZiBzdHJpbmdzLCBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBlbGVtZW50IGlzIHJldHVybmVkPC9saT4NCisgICAgICogPC91bD4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKE9iamVjdCBwVmFsdWUpIHsNCisgICAgICAgIGlmIChwVmFsdWUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgIHJldHVybiBudWxsOw0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgew0KKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBwVmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAocFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pIHsNCisgICAgICAgICAgICByZXR1cm4gKChTdHJpbmdbXSkgcFZhbHVlKVswXTsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwVmFsdWUgaW5zdGFuY2VvZiBMaXN0KSB7DQorICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpICgoTGlzdDw/PikgcFZhbHVlKS5nZXQoMCk7DQorICAgICAgICB9DQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIHBhcmFtZXRlciBjbGFzczogIiArIHBWYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDxwPkNvbnZlcnRzIHRoZSBnaXZlbiBvYmplY3QgaW50byBhIHN0cmluZyBhcnJheS4gVGhlIG9iamVjdCBtYXkgYmUgZWl0aGVyIG9mOg0KKyAgICAgKiA8dWw+DQorICAgICAqICAgPGxpPmEgc3RyaW5nLCB3aGljaCBpcyByZXR1cm5lZCBhcyBhbiBhcnJheSB3aXRoIG9uZSBlbGVtZW50PC9saT4NCisgICAgICogICA8bGk+YSBsaXN0IG9mIHN0cmluZ3MsIHdoaWNoIGlzIGJlaW5nIGNvbnZlcnRlZCBpbnRvIGEgc3RyaW5nIGFycmF5PC9saT4NCisgICAgICogICA8bGk+YW4gYXJyYXkgb2Ygc3RyaW5ncywgd2hpY2ggaXMgcmV0dXJuZWQgd2l0aG91dCBjb252ZXJzaW9uPC9saT4NCisgICAgICogPC91bD4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYXNTdHJpbmdBcnJheShPYmplY3QgcFZhbHVlKSB7DQorICAgICAgICBpZiAocFZhbHVlID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeyhTdHJpbmcpIHBWYWx1ZX07DQorICAgICAgICB9DQorICAgICAgICBpZiAocFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nW10pIHsNCisgICAgICAgICAgICByZXR1cm4gKFN0cmluZ1tdKSBwVmFsdWU7DQorICAgICAgICB9DQorICAgICAgICBpZiAocFZhbHVlIGluc3RhbmNlb2YgTGlzdCkgew0KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Pz4gbCA9IChMaXN0PD8+KSBwVmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIGwudG9BcnJheShuZXcgU3RyaW5nW2wuc2l6ZSgpXSk7DQorICAgICAgICB9DQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnZhbGlkIHBhcmFtZXRlciBjbGFzczogIiArIHBWYWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIDxwPkNvbnZlcnRzIHRoZSBnaXZlbiBvYmplY3QgaW50byBhIHN0cmluZyBlbnVtZXJhdGlvbi4gVGhlIG9iamVjdCBtYXkgYmUgZWl0aGVyIG9mOg0KKyAgICAgKiA8dWw+DQorICAgICAqICAgPGxpPmEgc3RyaW5nLCB3aGljaCBpcyByZXR1cm5lZCBhcyBhbiBlbnVtZXJhdGlvbiB3aXRoIG9uZSBlbGVtZW50PC9saT4NCisgICAgICogICA8bGk+YSBsaXN0IG9mIHN0cmluZ3MsIHdoaWNoIGlzIGJlaW5nIGNvbnZlcnRlZCBpbnRvIGEgc3RyaW5nIGVudW1lcmF0aW9uPC9saT4NCisgICAgICogICA8bGk+YW4gYXJyYXkgb2Ygc3RyaW5ncywgd2hpY2ggaXMgYmVpbmcgY29udmVydGVkIGludG8gYSBzdHJpbmcgZW51bWVyYXRpb248L2xpPg0KKyAgICAgKiA8L3VsPg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGFzU3RyaW5nRW51bShmaW5hbCBPYmplY3QgcFZhbHVlKSB7DQorICAgICAgICBpZiAocFZhbHVlID09IG51bGwpIHsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgICAgIGlmIChwVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisgICAgICAgICAgICByZXR1cm4gbmV3IEVudW1lcmF0aW9uPFN0cmluZz4oKXsNCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBPYmplY3QgdmFsdWUgPSBwVmFsdWU7DQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dEVsZW1lbnQoKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IChTdHJpbmcpIHZhbHVlOw0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsOw0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7DQorICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gdmFsdWVzID0gKFN0cmluZ1tdKSBwVmFsdWU7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnVtZXJhdGlvbjxTdHJpbmc+KCkgew0KKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBvZmZzZXQ7DQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsNCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPCB2YWx1ZXMubGVuZ3RoOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dEVsZW1lbnQoKSB7DQorICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID49IHZhbHVlcy5sZW5ndGgpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1tvZmZzZXQrK107DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9Ow0KKyAgICAgICAgfQ0KKyAgICAgICAgaWYgKHBWYWx1ZSBpbnN0YW5jZW9mIExpc3QpIHsNCisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikNCisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdCA9IChMaXN0PFN0cmluZz4pIHBWYWx1ZTsgDQorICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHN0cmluZ0xpc3QpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBwYXJhbWV0ZXIgY2xhc3M6ICIgKyBwVmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gbWFwIGludG8gYSBzdHJpbmcgYXJyYXkgbWFwOiBUaGUgbWFwIHZhbHVlcw0KKyAgICAgKiBhcmUgc3RyaW5nIGFycmF5cy4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nW10+IGFzTWFwKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcE1hcCkgew0KKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nW10+KHBNYXAuc2l6ZSgpKTsNCisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHBNYXAuZW50cnlTZXQoKSkgew0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHZhbHVlID0gYXNTdHJpbmdBcnJheShlbnRyeS5nZXRWYWx1ZSgpKTsNCisgICAgICAgICAgICByZXN1bHQucHV0KGVudHJ5LmdldEtleSgpLCB2YWx1ZSk7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc3VsdCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEFkZHMgYSB2YWx1ZSB0byB0aGUgZ2l2ZW4gbWFwLg0KKyAgICAgKi8NCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkTWFwVmFsdWUoTWFwPFN0cmluZywgT2JqZWN0PiBwTWFwLCBTdHJpbmcgcE5hbWUsIFN0cmluZyBwVmFsdWUpIHsNCisgICAgICAgIE9iamVjdCBvID0gcE1hcC5nZXQocE5hbWUpOw0KKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgew0KKyAgICAgICAgICAgIG8gPSBwVmFsdWU7DQorICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsNCisgICAgICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOw0KKyAgICAgICAgICAgIGxpc3QuYWRkKG8pOw0KKyAgICAgICAgICAgIGxpc3QuYWRkKHBWYWx1ZSk7DQorICAgICAgICAgICAgbyA9IGxpc3Q7DQorICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBMaXN0KSB7DQorICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpDQorICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHN0cmluZ0xpc3QgPSAoTGlzdDxTdHJpbmc+KSBvOyANCisgICAgICAgICAgICBzdHJpbmdMaXN0LmFkZChwVmFsdWUpOw0KKyAgICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nW10pIHsNCisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGFyciA9IChTdHJpbmdbXSkgbzsNCisgICAgICAgICAgICBmb3IgKFN0cmluZyBzdHIgOiBhcnIpIHsNCisgICAgICAgICAgICAgICAgbGlzdC5hZGQoc3RyKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgbGlzdC5hZGQocFZhbHVlKTsNCisgICAgICAgICAgICBvID0gbGlzdDsNCisgICAgICAgIH0gZWxzZSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW52YWxpZCBvYmplY3QgdHlwZTogIiArIG8uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcE1hcC5wdXQocE5hbWUsIG8pOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBMb3dlciBjYXNlcyB0aGUgZ2l2ZW4gbmFtZS4NCisgICAgICovDQorICAgIHByb3RlY3RlZCBTdHJpbmcgY29udmVydE5hbWUoU3RyaW5nIHBOYW1lKSB7DQorICAgICAgICByZXR1cm4gcE5hbWUudG9Mb3dlckNhc2UoKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgcmVxdWVzdGVkIHZhbHVlLg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShTdHJpbmcgcE5hbWUpIHsNCisgICAgICAgIHJldHVybiBhc1N0cmluZyhtYXAuZ2V0KGNvbnZlcnROYW1lKHBOYW1lKSkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSByZXF1ZXN0ZWQgdmFsdWVzIGFzIGEgc3RyaW5nIGFycmF5Lg0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcyhTdHJpbmcgcE5hbWUpIHsNCisgICAgICAgIHJldHVybiBhc1N0cmluZ0FycmF5KG1hcC5nZXQoY29udmVydE5hbWUocE5hbWUpKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgYXMgYW4gZW51bWVyYXRpb24uDQorICAgICAqLw0KKyAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRWYWx1ZUVudW0oU3RyaW5nIHBOYW1lKSB7DQorICAgICAgICByZXR1cm4gYXNTdHJpbmdFbnVtKG1hcC5nZXQoY29udmVydE5hbWUocE5hbWUpKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHNldCBvZiByZWdpc3RlcmVkIG5hbWVzIGFzIGFuIGVudW1lcmF0aW9uLg0KKyAgICAgKiBAc2VlICNnZXROYW1lQXJyYXkoKQ0KKyAgICAgKi8NCisgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0TmFtZXMoKSB7DQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24obWFwLmtleVNldCgpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgbWFwIG9mIG5hbWUvdmFsdWUgcGFpcnMuIFRoZSBtYXAga2V5cw0KKyAgICAgKiBhcmUgdGhlIGxvd2VyIGNhc2VkIHBhcmFtZXRlci9oZWFkZXIgbmFtZXMuIFRoZSBtYXAgdmFsdWVzIGFyZQ0KKyAgICAgKiBzdHJpbmcgYXJyYXlzLg0KKyAgICAgKi8NCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBnZXRNYXAoKSB7DQorICAgICAgICByZXR1cm4gYXNNYXAobWFwKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQWRkcyBhIG5ldyBuYW1lL3ZhbHVlIHBhaXIuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCBhZGRWYWx1ZShTdHJpbmcgcE5hbWUsIFN0cmluZyBwVmFsdWUpIHsNCisgICAgICAgIGFkZE1hcFZhbHVlKG1hcCwgY29udmVydE5hbWUocE5hbWUpLCBwVmFsdWUpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgcmVnaXN0ZXJlZCBuYW1lcy4NCisgICAgICogQHNlZSAjZ2V0TmFtZXMoKQ0KKyAgICAgKi8NCisgICAgcHVibGljIFN0cmluZ1tdIGdldE5hbWVBcnJheSgpIHsNCisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBjID0gbWFwLmtleVNldCgpOw0KKyAgICAgICAgcmV0dXJuIGMudG9BcnJheShuZXcgU3RyaW5nW2Muc2l6ZSgpXSk7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2NvbnRlbnRkaXNwb3NpdGlvbi9Db250ZW50RGlzcG9zaXRpb25QYXJzZXIuamogYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvY29udGVudGRpc3Bvc2l0aW9uL0NvbnRlbnREaXNwb3NpdGlvblBhcnNlci5qagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWViNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2NvbnRlbnRkaXNwb3NpdGlvbi9Db250ZW50RGlzcG9zaXRpb25QYXJzZXIuamoKQEAgLTAsMCArMSwyMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqCisgKiBSRkMyMTgzIENvbnRlbnQtRGlzcG9zaXRpb24gcGFyc2VyLgorICovCisKK29wdGlvbnMgeworCVNUQVRJQz1mYWxzZTsKKwlMT09LQUhFQUQ9MTsKKwlKREtfVkVSU0lPTiA9ICIxLjUiOworCU9VVFBVVF9ESVJFQ1RPUlkgPSAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2phdmFjYyI7CisJLy9ERUJVR19QQVJTRVI9dHJ1ZTsKKwkvL0RFQlVHX1RPS0VOX01BTkFHRVI9dHJ1ZTsKK30KKworUEFSU0VSX0JFR0lOKENvbnRlbnREaXNwb3NpdGlvblBhcnNlcikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmNvbnRlbnRkaXNwb3NpdGlvbi5wYXJzZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgQ29udGVudERpc3Bvc2l0aW9uUGFyc2VyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGRpc3Bvc2l0aW9uVHlwZTsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwYXJhbU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFyYW1WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcG9zaXRpb25UeXBlKCkgeworICAgICAgICByZXR1cm4gZGlzcG9zaXRpb25UeXBlOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFyYW1OYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtTmFtZXM7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYXJhbVZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtVmFsdWVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENvbnRlbnREaXNwb3NpdGlvblBhcnNlciBwYXJzZXIgPSBuZXcgQ29udGVudERpc3Bvc2l0aW9uUGFyc2VyKAorICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmluKTsKKyAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VMaW5lKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgIHgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitQQVJTRVJfRU5EKENvbnRlbnREaXNwb3NpdGlvblBhcnNlcikKKwordm9pZCBwYXJzZUxpbmUoKSA6Cit7fQoreworCXBhcnNlKCkgWyJcciJdICJcbiIKK30KKwordm9pZCBwYXJzZUFsbCgpIDoKK3t9Cit7CisJcGFyc2UoKSA8RU9GPgorfQorCit2b2lkIHBhcnNlKCkgOgoreworCVRva2VuIGRpc3Bvc2l0aW9uVHlwZTsKK30KK3sKKwlkaXNwb3NpdGlvblR5cGU9PEFUT0tFTj4KKwl7CisJCXRoaXMuZGlzcG9zaXRpb25UeXBlID0gZGlzcG9zaXRpb25UeXBlLmltYWdlOworCX0KKwkoICI7IiBwYXJhbWV0ZXIoKSApKgorfQorCit2b2lkIHBhcmFtZXRlcigpIDoKK3sKKwlUb2tlbiBhdHRyaWI7CisJU3RyaW5nIHZhbDsKK30KK3sKKwlhdHRyaWI9PEFUT0tFTj4gIj0iIHZhbD12YWx1ZSgpCisJeworCQlwYXJhbU5hbWVzLmFkZChhdHRyaWIuaW1hZ2UpOworCQlwYXJhbVZhbHVlcy5hZGQodmFsKTsKKwl9Cit9CisKK1N0cmluZyB2YWx1ZSgpIDoKK3tUb2tlbiB0O30KK3sKKygJdD08QVRPS0VOPgorfCAgIHQ9PERJR0lUUz4KK3wJdD08UVVPVEVEU1RSSU5HPgorKQorCXsgcmV0dXJuIHQuaW1hZ2U7IH0KK30KKworCisKK1NQRUNJQUxfVE9LRU4gOgoreworIAk8IFdTOiAoIFsiICIsICJcdCJdICkrID4KK30KKworVE9LRU5fTUdSX0RFQ0xTIDoKK3sKKwkvLyBLZWVwcyB0cmFjayBvZiBob3cgbWFueSBsZXZlbHMgb2YgY29tbWVudCBuZXN0aW5nCisJLy8gd2UndmUgZW5jb3VudGVyZWQuICBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSAybmQKKwkvLyBsZXZlbCBpcyByZWFjaGVkLCBmb3IgZXhhbXBsZSAoKHRoaXMpKSwgbm90ICh0aGlzKS4KKwkvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIG91dGVybW9zdCBsZXZlbCBtdXN0IGJlIHRyZWF0ZWQKKwkvLyBzcGVjaWFsbHkgYW55d2F5LCBiZWNhdXNlIHRoZSBvdXRlcm1vc3QgIikiIGhhcyBhCisJLy8gZGlmZmVyZW50IHRva2VuIHR5cGUgdGhhbiBpbm5lciAiKSIgaW5zdGFuY2VzLgorCXN0YXRpYyBpbnQgY29tbWVudE5lc3Q7Cit9CisKK01PUkUgOgoreworCS8vIHN0YXJ0cyBhIGNvbW1lbnQKKwkiKCIgOiBJTkNPTU1FTlQKK30KKworPElOQ09NTUVOVD4KK1NLSVAgOgoreworCS8vIGVuZHMgYSBjb21tZW50CisJPCBDT01NRU5UOiAiKSIgPiA6IERFRkFVTFQKKwkvLyBpZiB0aGlzIGlzIGV2ZXIgY2hhbmdlZCB0byBub3QgYmUgYSBTS0lQLCBuZWVkCisJLy8gdG8gbWFrZSBzdXJlIG1hdGNoZWRUb2tlbi50b2tlbiA9IHRva2VuLnRvU3RyaW5nKCkKKwkvLyBpcyBjYWxsZWQuCit9CisKKzxJTkNPTU1FTlQ+CitNT1JFIDoKK3sKKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQorfAkiKCIgeyBjb21tZW50TmVzdCA9IDE7IH0gOiBORVNURURfQ09NTUVOVAorfAk8IDxBTlk+PgorfQorCis8TkVTVEVEX0NPTU1FTlQ+CitNT1JFIDoKK3sKKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQorfAkiKCIgeyArK2NvbW1lbnROZXN0OyB9Cit8CSIpIiB7IC0tY29tbWVudE5lc3Q7IGlmIChjb21tZW50TmVzdCA9PSAwKSBTd2l0Y2hUbyhJTkNPTU1FTlQpOyB9Cit8CTwgPEFOWT4+Cit9CisKKworCisvLyBRVU9URUQgU1RSSU5HUworCitNT1JFIDoKK3sKKwkiXCIiIHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMSk7IH0gOiBJTlFVT1RFRFNUUklORworfQorCis8SU5RVU9URURTVFJJTkc+CitNT1JFIDoKK3sKKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQorfAk8ICh+WyJcIiIsICJcXCJdKSsgPgorfQorCis8SU5RVU9URURTVFJJTkc+CitUT0tFTiA6Cit7CisJPCBRVU9URURTVFJJTkc6ICJcIiIgPiB7IG1hdGNoZWRUb2tlbi5pbWFnZSA9IGltYWdlLnN1YnN0cmluZygwLCBpbWFnZS5sZW5ndGgoKSAtIDEpOyB9IDogREVGQVVMVAorfQorCisKK1RPS0VOIDoKK3sKKwk8IERJR0lUUzogKCBbIjAiLSI5Il0gKSsgPgorfQorCitUT0tFTiA6Cit7CisJPCBBVE9LRU46ICggflsiICIsICJcdCIsICIoIiwgIikiLCAiPCIsICI+IiwgIkAiLCAiLCIsICI7IiwgIjoiLCAiXFwiLCAiXCIiLCAiLyIsICJbIiwgIl0iLCAiPyIsICI9Il0gKSsgPgorfQorCisKKy8vIEdMT0JBTFMKKworPCo+CitUT0tFTiA6Cit7CisJPCAjUVVPVEVEUEFJUjogIlxcIiA8QU5ZPiA+Cit8CTwgI0FOWTogfltdID4KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9jb250ZW50ZGlzcG9zaXRpb24vUGFyc2VFeGNlcHRpb24uamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9jb250ZW50ZGlzcG9zaXRpb24vUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRkYjUwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2NvbnRlbnRkaXNwb3NpdGlvbi9QYXJzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFBhcnNlRXhjZXB0aW9uLmphdmEgVmVyc2lvbiAzLjAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuY29udGVudGRpc3Bvc2l0aW9uLnBhcnNlcjsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBwYXJzZSBlcnJvcnMgYXJlIGVuY291bnRlcmVkLgorICogWW91IGNhbiBleHBsaWNpdGx5IGNyZWF0ZSBvYmplY3RzIG9mIHRoaXMgZXhjZXB0aW9uIHR5cGUgYnkKKyAqIGNhbGxpbmcgdGhlIG1ldGhvZCBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIGluIHRoZSBnZW5lcmF0ZWQKKyAqIHBhcnNlci4KKyAqCisgKiBDaGFuZ2VzIGZvciBNaW1lNEo6CisgKiAgIGV4dGVuZHMgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuUGFyc2VFeGNlcHRpb24KKyAqICAgYWRkZWQgc2VyaWFsVmVyc2lvblVJRAorICogICBhZGRlZCBjb25zdHJ1Y3RvciBQYXJzZUV4Y2VwdGlvbihUaHJvd2FibGUpCisgKiAgIGRlZmF1bHQgZGV0YWlsIG1lc3NhZ2UgaXMgIkNhbm5vdCBwYXJzZSBmaWVsZCIKKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuUGFyc2VFeGNlcHRpb24geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qKgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIG1ldGhvZCAiZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiIKKyAgICogaW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIuICBDYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZ2VuZXJhdGVzCisgICAqIGEgbmV3IG9iamVjdCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgZmllbGRzICJjdXJyZW50VG9rZW4iLAorICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgc2V0LiAgVGhlIGJvb2xlYW4KKyAgICogZmxhZyAic3BlY2lhbENvbnN0cnVjdG9yIiBpcyBhbHNvIHNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQKKyAgICogdGhpcyBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QuCisgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgaXRzIHN1cGVyIGNsYXNzIHdpdGggdGhlIGVtcHR5IHN0cmluZworICAgKiB0byBmb3JjZSB0aGUgInRvU3RyaW5nIiBtZXRob2Qgb2YgcGFyZW50IGNsYXNzICJUaHJvd2FibGUiIHRvCisgICAqIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBmb3JtOgorICAgKiAgICAgUGFyc2VFeGNlcHRpb246IDxyZXN1bHQgb2YgZ2V0TWVzc2FnZT4KKyAgICovCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsCisgICAgICAgICAgICAgICAgICAgICAgICkKKyAgeworICAgIHN1cGVyKCIiKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSB0cnVlOworICAgIGN1cnJlbnRUb2tlbiA9IGN1cnJlbnRUb2tlblZhbDsKKyAgICBleHBlY3RlZFRva2VuU2VxdWVuY2VzID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbDsKKyAgICB0b2tlbkltYWdlID0gdG9rZW5JbWFnZVZhbDsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9ycyBhcmUgZm9yIHVzZSBieSB5b3UgZm9yIHdoYXRldmVyCisgICAqIHB1cnBvc2UgeW91IGNhbiB0aGluayBvZi4gIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKKyAgICogbWFubmVyIG1ha2VzIHRoZSBleGNlcHRpb24gYmVoYXZlIGluIHRoZSBub3JtYWwgd2F5IC0gaS5lLiwgYXMKKyAgICogZG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgIlRocm93YWJsZSIuICBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIGRvIG5vdCBjb250YWluCisgICAqIHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKKyAgICogdGhlc2UgY29uc3RydWN0b3JzLgorICAgKi8KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oKSB7CisgICAgc3VwZXIoIkNhbm5vdCBwYXJzZSBmaWVsZCIpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOworICB9CisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGljaCBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUKKyAgICogdGhpcyBvYmplY3QgYW5kIHRoZXJlYnkgYWZmZWN0cyB0aGUgc2VtYW50aWNzIG9mIHRoZQorICAgKiAiZ2V0TWVzc2FnZSIgbWV0aG9kIChzZWUgYmVsb3cpLgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lhbENvbnN0cnVjdG9yOworCisgIC8qKgorICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKKyAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCisgICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCisgICAqLworICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOworCisgIC8qKgorICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5CisgICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKKyAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgorICAgKi8KKyAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKKworICAvKioKKyAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKKyAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCisgICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc3RhbmRhcmQgYmVoYXZpb3Igd2hlbiB0aGlzIG9iamVjdCBoYXMgYmVlbgorICAgKiBjcmVhdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvcnMuICBPdGhlcndpc2UsIGl0IHVzZXMKKyAgICogImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCisgICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCisgICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KKyAgICogZnJvbSB0aGUgcGFyc2VyKSwgdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBwcmludGluZworICAgKiBvZiB0aGUgZmluYWwgc3RhY2sgdHJhY2UsIGFuZCBoZW5jZSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCisgICAqIGdldHMgZGlzcGxheWVkLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIGlmICghc3BlY2lhbENvbnN0cnVjdG9yKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgICBTdHJpbmdCdWZmZXIgZXhwZWN0ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgaW50IG1heFNpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKG1heFNpemUgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCkgeworICAgICAgICBtYXhTaXplID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7CisgICAgICB9CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKHRva2VuSW1hZ2VbZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtqXV0pLmFwcGVuZCgiICIpOworICAgICAgfQorICAgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGggLSAxXSAhPSAwKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCgiLi4uIik7CisgICAgICB9CisgICAgICBleHBlY3RlZC5hcHBlbmQoZW9sKS5hcHBlbmQoIiAgICAiKTsKKyAgICB9CisgICAgU3RyaW5nIHJldHZhbCA9ICJFbmNvdW50ZXJlZCBcIiI7CisgICAgVG9rZW4gdG9rID0gY3VycmVudFRva2VuLm5leHQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTaXplOyBpKyspIHsKKyAgICAgIGlmIChpICE9IDApIHJldHZhbCArPSAiICI7CisgICAgICBpZiAodG9rLmtpbmQgPT0gMCkgeworICAgICAgICByZXR2YWwgKz0gdG9rZW5JbWFnZVswXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR2YWwgKz0gYWRkX2VzY2FwZXModG9rLmltYWdlKTsKKyAgICAgIHRvayA9IHRvay5uZXh0OyAKKyAgICB9CisgICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOworICAgIHJldHZhbCArPSAiLiIgKyBlb2w7CisgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKKyAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOworICAgIH0gZWxzZSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7CisgICAgfQorICAgIHJldHZhbCArPSBleHBlY3RlZC50b1N0cmluZygpOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisgCisgIC8qKgorICAgKiBVc2VkIHRvIGNvbnZlcnQgcmF3IGNoYXJhY3RlcnMgdG8gdGhlaXIgZXNjYXBlZCB2ZXJzaW9uCisgICAqIHdoZW4gdGhlc2UgcmF3IHZlcnNpb24gY2Fubm90IGJlIHVzZWQgYXMgcGFydCBvZiBhbiBBU0NJSQorICAgKiBzdHJpbmcgbGl0ZXJhbC4KKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgYWRkX2VzY2FwZXMoU3RyaW5nIHN0cikgeworICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgIGNoYXIgY2g7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKKyAgICAgICAgeworICAgICAgICAgICBjYXNlIDAgOgorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgeworICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7CisgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9jb250ZW50dHlwZS9Db250ZW50VHlwZVBhcnNlci5qaiBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9jb250ZW50dHlwZS9Db250ZW50VHlwZVBhcnNlci5qagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzRmZWZiCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlUGFyc2VyLmpqCkBAIC0wLDAgKzEsMjI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQorLyoqDQorICogUkZDMjA0NSBDb250ZW50LVR5cGUgcGFyc2VyLg0KKyAqDQorICogQ3JlYXRlZCAxMC8yLzIwMDQNCisgKiBieSBKb2UgQ2hlbmcgPGNvZGVAam9lY2hlbmcuY29tPg0KKyAqLw0KKw0KK29wdGlvbnMgew0KKwlTVEFUSUM9ZmFsc2U7DQorCUxPT0tBSEVBRD0xOw0KKwlKREtfVkVSU0lPTiA9ICIxLjUiOw0KKwlPVVRQVVRfRElSRUNUT1JZID0gIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3RhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9qYXZhY2MiOw0KKwkvL0RFQlVHX1BBUlNFUj10cnVlOw0KKwkvL0RFQlVHX1RPS0VOX01BTkFHRVI9dHJ1ZTsNCit9DQorDQorUEFSU0VSX0JFR0lOKENvbnRlbnRUeXBlUGFyc2VyKQ0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmNvbnRlbnR0eXBlLnBhcnNlcjsNCisNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQorDQorcHVibGljIGNsYXNzIENvbnRlbnRUeXBlUGFyc2VyIHsNCisNCisJcHJpdmF0ZSBTdHJpbmcgdHlwZTsNCisJcHJpdmF0ZSBTdHJpbmcgc3VidHlwZTsNCisJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFyYW1OYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBwYXJhbVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKw0KKwlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7IHJldHVybiB0eXBlOyB9DQorCXB1YmxpYyBTdHJpbmcgZ2V0U3ViVHlwZSgpIHsgcmV0dXJuIHN1YnR5cGU7IH0NCisJcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYXJhbU5hbWVzKCkgeyByZXR1cm4gcGFyYW1OYW1lczsgfQ0KKwlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhcmFtVmFsdWVzKCkgeyByZXR1cm4gcGFyYW1WYWx1ZXM7IH0NCisNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsNCisJd2hpbGUgKHRydWUpIHsNCisJICAgIHRyeSB7DQorCQlDb250ZW50VHlwZVBhcnNlciBwYXJzZXIgPSBuZXcgQ29udGVudFR5cGVQYXJzZXIoU3lzdGVtLmluKTsNCisJICAgIAlwYXJzZXIucGFyc2VMaW5lKCk7DQorCSAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgew0KKwkJeC5wcmludFN0YWNrVHJhY2UoKTsNCisJCXJldHVybjsNCisJICAgIH0NCisJfQ0KKyAgICB9DQorfQ0KKw0KK1BBUlNFUl9FTkQoQ29udGVudFR5cGVQYXJzZXIpDQorDQordm9pZCBwYXJzZUxpbmUoKSA6DQore30NCit7DQorCXBhcnNlKCkgWyJcciJdICJcbiINCit9DQorDQordm9pZCBwYXJzZUFsbCgpIDoNCit7fQ0KK3sNCisJcGFyc2UoKSA8RU9GPg0KK30NCisNCit2b2lkIHBhcnNlKCkgOg0KK3sNCisJVG9rZW4gdHlwZTsNCisJVG9rZW4gc3VidHlwZTsNCit9DQorew0KKwl0eXBlPTxBVE9LRU4+ICIvIiBzdWJ0eXBlPTxBVE9LRU4+DQorCXsNCisJCXRoaXMudHlwZSA9IHR5cGUuaW1hZ2U7DQorCQl0aGlzLnN1YnR5cGUgPSBzdWJ0eXBlLmltYWdlOw0KKwl9DQorCSggIjsiIHBhcmFtZXRlcigpICkqDQorfQ0KKw0KK3ZvaWQgcGFyYW1ldGVyKCkgOg0KK3sNCisJVG9rZW4gYXR0cmliOw0KKwlTdHJpbmcgdmFsOw0KK30NCit7DQorCWF0dHJpYj08QVRPS0VOPiAiPSIgdmFsPXZhbHVlKCkNCisJew0KKwkJcGFyYW1OYW1lcy5hZGQoYXR0cmliLmltYWdlKTsNCisJCXBhcmFtVmFsdWVzLmFkZCh2YWwpOw0KKwl9DQorfQ0KKw0KK1N0cmluZyB2YWx1ZSgpIDoNCit7VG9rZW4gdDt9DQorew0KKygJdD08QVRPS0VOPg0KK3wgICB0PTxESUdJVFM+DQorfAl0PTxRVU9URURTVFJJTkc+DQorKQ0KKwl7IHJldHVybiB0LmltYWdlOyB9DQorfQ0KKw0KKw0KKw0KK1NQRUNJQUxfVE9LRU4gOg0KK3sNCisgCTwgV1M6ICggWyIgIiwgIlx0Il0gKSsgPg0KK30NCisNCitUT0tFTl9NR1JfREVDTFMgOg0KK3sNCisJLy8gS2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgbGV2ZWxzIG9mIGNvbW1lbnQgbmVzdGluZw0KKwkvLyB3ZSd2ZSBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIDJuZA0KKwkvLyBsZXZlbCBpcyByZWFjaGVkLCBmb3IgZXhhbXBsZSAoKHRoaXMpKSwgbm90ICh0aGlzKS4NCisJLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRlcm1vc3QgbGV2ZWwgbXVzdCBiZSB0cmVhdGVkDQorCS8vIHNwZWNpYWxseSBhbnl3YXksIGJlY2F1c2UgdGhlIG91dGVybW9zdCAiKSIgaGFzIGENCisJLy8gZGlmZmVyZW50IHRva2VuIHR5cGUgdGhhbiBpbm5lciAiKSIgaW5zdGFuY2VzLg0KKwlzdGF0aWMgaW50IGNvbW1lbnROZXN0Ow0KK30NCisNCitNT1JFIDoNCit7DQorCS8vIHN0YXJ0cyBhIGNvbW1lbnQNCisJIigiIDogSU5DT01NRU5UDQorfQ0KKw0KKzxJTkNPTU1FTlQ+DQorU0tJUCA6DQorew0KKwkvLyBlbmRzIGEgY29tbWVudA0KKwk8IENPTU1FTlQ6ICIpIiA+IDogREVGQVVMVA0KKwkvLyBpZiB0aGlzIGlzIGV2ZXIgY2hhbmdlZCB0byBub3QgYmUgYSBTS0lQLCBuZWVkDQorCS8vIHRvIG1ha2Ugc3VyZSBtYXRjaGVkVG9rZW4udG9rZW4gPSB0b2tlbi50b1N0cmluZygpDQorCS8vIGlzIGNhbGxlZC4NCit9DQorDQorPElOQ09NTUVOVD4NCitNT1JFIDoNCit7DQorCTwgPFFVT1RFRFBBSVI+PiB7IGltYWdlLmRlbGV0ZUNoYXJBdChpbWFnZS5sZW5ndGgoKSAtIDIpOyB9DQorfAkiKCIgeyBjb21tZW50TmVzdCA9IDE7IH0gOiBORVNURURfQ09NTUVOVA0KK3wJPCA8QU5ZPj4NCit9DQorDQorPE5FU1RFRF9DT01NRU5UPg0KK01PUkUgOg0KK3sNCisJPCA8UVVPVEVEUEFJUj4+IHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMik7IH0NCit8CSIoIiB7ICsrY29tbWVudE5lc3Q7IH0NCit8CSIpIiB7IC0tY29tbWVudE5lc3Q7IGlmIChjb21tZW50TmVzdCA9PSAwKSBTd2l0Y2hUbyhJTkNPTU1FTlQpOyB9DQorfAk8IDxBTlk+Pg0KK30NCisNCisNCisNCisvLyBRVU9URUQgU1RSSU5HUw0KKw0KK01PUkUgOg0KK3sNCisJIlwiIiB7IGltYWdlLmRlbGV0ZUNoYXJBdChpbWFnZS5sZW5ndGgoKSAtIDEpOyB9IDogSU5RVU9URURTVFJJTkcNCit9DQorDQorPElOUVVPVEVEU1RSSU5HPg0KK01PUkUgOg0KK3sNCisJPCA8UVVPVEVEUEFJUj4+IHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMik7IH0NCit8CTwgKH5bIlwiIiwgIlxcIl0pKyA+DQorfQ0KKw0KKzxJTlFVT1RFRFNUUklORz4NCitUT0tFTiA6DQorew0KKwk8IFFVT1RFRFNUUklORzogIlwiIiA+IHsgbWF0Y2hlZFRva2VuLmltYWdlID0gaW1hZ2Uuc3Vic3RyaW5nKDAsIGltYWdlLmxlbmd0aCgpIC0gMSk7IH0gOiBERUZBVUxUDQorfQ0KKw0KKw0KK1RPS0VOIDoNCit7DQorCTwgRElHSVRTOiAoIFsiMCItIjkiXSApKyA+DQorfQ0KKw0KK1RPS0VOIDoNCit7DQorCTwgQVRPS0VOOiAoIH5bIiAiLCAiXHQiLCAiKCIsICIpIiwgIjwiLCAiPiIsICJAIiwgIiwiLCAiOyIsICI6IiwgIlxcIiwgIlwiIiwgIi8iLCAiWyIsICJdIiwgIj8iLCAiPSJdICkrID4NCit9DQorDQorDQorLy8gR0xPQkFMUw0KKw0KKzwqPg0KK1RPS0VOIDoNCit7DQorCTwgI1FVT1RFRFBBSVI6ICJcXCIgPEFOWT4gPg0KK3wJPCAjQU5ZOiB+W10gPg0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvY29udGVudHR5cGUvUGFyc2VFeGNlcHRpb24uamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9jb250ZW50dHlwZS9QYXJzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODFkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvY29udGVudHR5cGUvUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gMy4wICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmNvbnRlbnR0eXBlLnBhcnNlcjsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBwYXJzZSBlcnJvcnMgYXJlIGVuY291bnRlcmVkLgorICogWW91IGNhbiBleHBsaWNpdGx5IGNyZWF0ZSBvYmplY3RzIG9mIHRoaXMgZXhjZXB0aW9uIHR5cGUgYnkKKyAqIGNhbGxpbmcgdGhlIG1ldGhvZCBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIGluIHRoZSBnZW5lcmF0ZWQKKyAqIHBhcnNlci4KKyAqCisgKiBDaGFuZ2VzIGZvciBNaW1lNEo6CisgKiAgIGV4dGVuZHMgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuUGFyc2VFeGNlcHRpb24KKyAqICAgYWRkZWQgc2VyaWFsVmVyc2lvblVJRAorICogICBhZGRlZCBjb25zdHJ1Y3RvciBQYXJzZUV4Y2VwdGlvbihUaHJvd2FibGUpCisgKiAgIGRlZmF1bHQgZGV0YWlsIG1lc3NhZ2UgaXMgIkNhbm5vdCBwYXJzZSBmaWVsZCIKKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuUGFyc2VFeGNlcHRpb24geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qKgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIG1ldGhvZCAiZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiIKKyAgICogaW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIuICBDYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZ2VuZXJhdGVzCisgICAqIGEgbmV3IG9iamVjdCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgZmllbGRzICJjdXJyZW50VG9rZW4iLAorICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgc2V0LiAgVGhlIGJvb2xlYW4KKyAgICogZmxhZyAic3BlY2lhbENvbnN0cnVjdG9yIiBpcyBhbHNvIHNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQKKyAgICogdGhpcyBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QuCisgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgaXRzIHN1cGVyIGNsYXNzIHdpdGggdGhlIGVtcHR5IHN0cmluZworICAgKiB0byBmb3JjZSB0aGUgInRvU3RyaW5nIiBtZXRob2Qgb2YgcGFyZW50IGNsYXNzICJUaHJvd2FibGUiIHRvCisgICAqIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBmb3JtOgorICAgKiAgICAgUGFyc2VFeGNlcHRpb246IDxyZXN1bHQgb2YgZ2V0TWVzc2FnZT4KKyAgICovCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsCisgICAgICAgICAgICAgICAgICAgICAgICkKKyAgeworICAgIHN1cGVyKCIiKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSB0cnVlOworICAgIGN1cnJlbnRUb2tlbiA9IGN1cnJlbnRUb2tlblZhbDsKKyAgICBleHBlY3RlZFRva2VuU2VxdWVuY2VzID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbDsKKyAgICB0b2tlbkltYWdlID0gdG9rZW5JbWFnZVZhbDsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9ycyBhcmUgZm9yIHVzZSBieSB5b3UgZm9yIHdoYXRldmVyCisgICAqIHB1cnBvc2UgeW91IGNhbiB0aGluayBvZi4gIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKKyAgICogbWFubmVyIG1ha2VzIHRoZSBleGNlcHRpb24gYmVoYXZlIGluIHRoZSBub3JtYWwgd2F5IC0gaS5lLiwgYXMKKyAgICogZG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgIlRocm93YWJsZSIuICBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIGRvIG5vdCBjb250YWluCisgICAqIHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKKyAgICogdGhlc2UgY29uc3RydWN0b3JzLgorICAgKi8KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oKSB7CisgICAgc3VwZXIoIkNhbm5vdCBwYXJzZSBmaWVsZCIpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOworICB9CisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGljaCBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUKKyAgICogdGhpcyBvYmplY3QgYW5kIHRoZXJlYnkgYWZmZWN0cyB0aGUgc2VtYW50aWNzIG9mIHRoZQorICAgKiAiZ2V0TWVzc2FnZSIgbWV0aG9kIChzZWUgYmVsb3cpLgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lhbENvbnN0cnVjdG9yOworCisgIC8qKgorICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKKyAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCisgICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCisgICAqLworICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOworCisgIC8qKgorICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5CisgICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKKyAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgorICAgKi8KKyAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKKworICAvKioKKyAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKKyAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCisgICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc3RhbmRhcmQgYmVoYXZpb3Igd2hlbiB0aGlzIG9iamVjdCBoYXMgYmVlbgorICAgKiBjcmVhdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvcnMuICBPdGhlcndpc2UsIGl0IHVzZXMKKyAgICogImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCisgICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCisgICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KKyAgICogZnJvbSB0aGUgcGFyc2VyKSwgdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBwcmludGluZworICAgKiBvZiB0aGUgZmluYWwgc3RhY2sgdHJhY2UsIGFuZCBoZW5jZSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCisgICAqIGdldHMgZGlzcGxheWVkLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIGlmICghc3BlY2lhbENvbnN0cnVjdG9yKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgICBTdHJpbmdCdWZmZXIgZXhwZWN0ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgaW50IG1heFNpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKG1heFNpemUgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCkgeworICAgICAgICBtYXhTaXplID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7CisgICAgICB9CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKHRva2VuSW1hZ2VbZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtqXV0pLmFwcGVuZCgiICIpOworICAgICAgfQorICAgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGggLSAxXSAhPSAwKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCgiLi4uIik7CisgICAgICB9CisgICAgICBleHBlY3RlZC5hcHBlbmQoZW9sKS5hcHBlbmQoIiAgICAiKTsKKyAgICB9CisgICAgU3RyaW5nIHJldHZhbCA9ICJFbmNvdW50ZXJlZCBcIiI7CisgICAgVG9rZW4gdG9rID0gY3VycmVudFRva2VuLm5leHQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTaXplOyBpKyspIHsKKyAgICAgIGlmIChpICE9IDApIHJldHZhbCArPSAiICI7CisgICAgICBpZiAodG9rLmtpbmQgPT0gMCkgeworICAgICAgICByZXR2YWwgKz0gdG9rZW5JbWFnZVswXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR2YWwgKz0gYWRkX2VzY2FwZXModG9rLmltYWdlKTsKKyAgICAgIHRvayA9IHRvay5uZXh0OyAKKyAgICB9CisgICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOworICAgIHJldHZhbCArPSAiLiIgKyBlb2w7CisgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKKyAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOworICAgIH0gZWxzZSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7CisgICAgfQorICAgIHJldHZhbCArPSBleHBlY3RlZC50b1N0cmluZygpOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisgCisgIC8qKgorICAgKiBVc2VkIHRvIGNvbnZlcnQgcmF3IGNoYXJhY3RlcnMgdG8gdGhlaXIgZXNjYXBlZCB2ZXJzaW9uCisgICAqIHdoZW4gdGhlc2UgcmF3IHZlcnNpb24gY2Fubm90IGJlIHVzZWQgYXMgcGFydCBvZiBhbiBBU0NJSQorICAgKiBzdHJpbmcgbGl0ZXJhbC4KKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgYWRkX2VzY2FwZXMoU3RyaW5nIHN0cikgeworICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgIGNoYXIgY2g7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKKyAgICAgICAgeworICAgICAgICAgICBjYXNlIDAgOgorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgeworICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7CisgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9kYXRldGltZS9EYXRlVGltZVBhcnNlci5qaiBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9kYXRldGltZS9EYXRlVGltZVBhcnNlci5qagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGNiNDE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2RhdGV0aW1lL0RhdGVUaW1lUGFyc2VyLmpqCkBAIC0wLDAgKzEsMzQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQorLyoqDQorICogUkZDMjgyMiBkYXRlIHBhcnNlci4NCisgKg0KKyAqIENyZWF0ZWQgOS8yOC8yMDA0DQorICogYnkgSm9lIENoZW5nIDxjb2RlQGpvZWNoZW5nLmNvbT4NCisgKi8NCisNCitvcHRpb25zIHsNCisJU1RBVElDPWZhbHNlOw0KKwlMT09LQUhFQUQ9MTsNCisJSkRLX1ZFUlNJT04gPSAiMS41IjsNCisJT1VUUFVUX0RJUkVDVE9SWSA9ICIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvamF2YWNjIjsNCisJLy9ERUJVR19QQVJTRVI9dHJ1ZTsNCisJLy9ERUJVR19UT0tFTl9NQU5BR0VSPXRydWU7DQorfQ0KKw0KK1BBUlNFUl9CRUdJTihEYXRlVGltZVBhcnNlcikNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5kYXRldGltZS5wYXJzZXI7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmRhdGV0aW1lLkRhdGVUaW1lOw0KKw0KK3B1YmxpYyBjbGFzcyBEYXRlVGltZVBhcnNlciB7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaWdub3JlTWlsaXRhcnlab25lT2Zmc2V0ID0gdHJ1ZTsNCisNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsNCisJCXdoaWxlICh0cnVlKSB7DQorCQkgICAgdHJ5IHsNCisJCQkJRGF0ZVRpbWVQYXJzZXIgcGFyc2VyID0gbmV3IERhdGVUaW1lUGFyc2VyKFN5c3RlbS5pbik7DQorCQkgICAgCXBhcnNlci5wYXJzZUxpbmUoKTsNCisJCSAgICB9IGNhdGNoIChFeGNlcHRpb24geCkgew0KKwkJCQl4LnByaW50U3RhY2tUcmFjZSgpOw0KKwkJCQlyZXR1cm47DQorCQkgICAgfQ0KKwkJfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJzZURpZ2l0cyhUb2tlbiB0b2tlbikgew0KKyAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodG9rZW4uaW1hZ2UsIDEwKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWlsaXRhcnlab25lT2Zmc2V0KGNoYXIgYykgew0KKyAgICAgICAgaWYgKGlnbm9yZU1pbGl0YXJ5Wm9uZU9mZnNldCkNCisgICAgICAgICAgICByZXR1cm4gMDsNCisNCisgICAgICAgIGMgPSBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyk7DQorDQorICAgICAgICBzd2l0Y2ggKGMpIHsNCisgICAgICAgICAgICBjYXNlICdBJzogcmV0dXJuIDE7DQorICAgICAgICAgICAgY2FzZSAnQic6IHJldHVybiAyOw0KKyAgICAgICAgICAgIGNhc2UgJ0MnOiByZXR1cm4gMzsNCisgICAgICAgICAgICBjYXNlICdEJzogcmV0dXJuIDQ7DQorICAgICAgICAgICAgY2FzZSAnRSc6IHJldHVybiA1Ow0KKyAgICAgICAgICAgIGNhc2UgJ0YnOiByZXR1cm4gNjsNCisgICAgICAgICAgICBjYXNlICdHJzogcmV0dXJuIDc7DQorICAgICAgICAgICAgY2FzZSAnSCc6IHJldHVybiA4Ow0KKyAgICAgICAgICAgIGNhc2UgJ0knOiByZXR1cm4gOTsNCisgICAgICAgICAgICBjYXNlICdLJzogcmV0dXJuIDEwOw0KKyAgICAgICAgICAgIGNhc2UgJ0wnOiByZXR1cm4gMTE7DQorICAgICAgICAgICAgY2FzZSAnTSc6IHJldHVybiAxMjsNCisNCisgICAgICAgICAgICBjYXNlICdOJzogcmV0dXJuIC0xOw0KKyAgICAgICAgICAgIGNhc2UgJ08nOiByZXR1cm4gLTI7DQorICAgICAgICAgICAgY2FzZSAnUCc6IHJldHVybiAtMzsNCisgICAgICAgICAgICBjYXNlICdRJzogcmV0dXJuIC00Ow0KKyAgICAgICAgICAgIGNhc2UgJ1InOiByZXR1cm4gLTU7DQorICAgICAgICAgICAgY2FzZSAnUyc6IHJldHVybiAtNjsNCisgICAgICAgICAgICBjYXNlICdUJzogcmV0dXJuIC03Ow0KKyAgICAgICAgICAgIGNhc2UgJ1UnOiByZXR1cm4gLTg7DQorICAgICAgICAgICAgY2FzZSAnVic6IHJldHVybiAtOTsNCisgICAgICAgICAgICBjYXNlICdXJzogcmV0dXJuIC0xMDsNCisgICAgICAgICAgICBjYXNlICdYJzogcmV0dXJuIC0xMTsNCisgICAgICAgICAgICBjYXNlICdZJzogcmV0dXJuIC0xMjsNCisNCisgICAgICAgICAgICBjYXNlICdaJzogcmV0dXJuIDA7DQorICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGltZSB7DQorICAgICAgICBwcml2YXRlIGludCBob3VyOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWludXRlOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgc2Vjb25kOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgem9uZTsNCisNCisgICAgICAgIHB1YmxpYyBUaW1lKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kLCBpbnQgem9uZSkgew0KKyAgICAgICAgICAgIHRoaXMuaG91ciA9IGhvdXI7DQorICAgICAgICAgICAgdGhpcy5taW51dGUgPSBtaW51dGU7DQorICAgICAgICAgICAgdGhpcy5zZWNvbmQgPSBzZWNvbmQ7DQorICAgICAgICAgICAgdGhpcy56b25lID0gem9uZTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SG91cigpIHsgcmV0dXJuIGhvdXI7IH0NCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TWludXRlKCkgeyByZXR1cm4gbWludXRlOyB9DQorICAgICAgICBwdWJsaWMgaW50IGdldFNlY29uZCgpIHsgcmV0dXJuIHNlY29uZDsgfQ0KKyAgICAgICAgcHVibGljIGludCBnZXRab25lKCkgeyByZXR1cm4gem9uZTsgfQ0KKyAgICB9DQorDQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERhdGUgew0KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgeWVhcjsNCisgICAgICAgIHByaXZhdGUgaW50IG1vbnRoOw0KKyAgICAgICAgcHJpdmF0ZSBpbnQgZGF5Ow0KKw0KKyAgICAgICAgcHVibGljIERhdGUoU3RyaW5nIHllYXIsIGludCBtb250aCwgaW50IGRheSkgew0KKyAgICAgICAgICAgIHRoaXMueWVhciA9IHllYXI7DQorICAgICAgICAgICAgdGhpcy5tb250aCA9IG1vbnRoOw0KKyAgICAgICAgICAgIHRoaXMuZGF5ID0gZGF5Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRZZWFyKCkgeyByZXR1cm4geWVhcjsgfQ0KKyAgICAgICAgcHVibGljIGludCBnZXRNb250aCgpIHsgcmV0dXJuIG1vbnRoOyB9DQorICAgICAgICBwdWJsaWMgaW50IGdldERheSgpIHsgcmV0dXJuIGRheTsgfQ0KKyAgICB9DQorfQ0KKw0KK1BBUlNFUl9FTkQoRGF0ZVRpbWVQYXJzZXIpDQorDQorRGF0ZVRpbWUgcGFyc2VMaW5lKCkgOg0KK3tEYXRlVGltZSBkdDt9DQorew0KKwlkdD1kYXRlX3RpbWUoKSBbIlxyIl0gIlxuIg0KKwl7IHJldHVybiBkdDsgfQ0KK30NCisNCitEYXRlVGltZSBwYXJzZUFsbCgpIDoNCit7RGF0ZVRpbWUgZHQ7fQ0KK3sNCisJZHQ9ZGF0ZV90aW1lKCkgPEVPRj4NCisJeyByZXR1cm4gZHQ7IH0NCit9DQorDQorRGF0ZVRpbWUgZGF0ZV90aW1lKCkgOg0KK3tEYXRlIGQ7IFRpbWUgdDt9DQorew0KKwlbIGRheV9vZl93ZWVrKCkgIiwiIF0NCisJZD1kYXRlKCkNCisJdD10aW1lKCkNCisJew0KKwkgICAgcmV0dXJuIG5ldyBEYXRlVGltZSgNCisJICAgICAgICAgICAgZC5nZXRZZWFyKCksDQorCSAgICAgICAgICAgIGQuZ2V0TW9udGgoKSwNCisJICAgICAgICAgICAgZC5nZXREYXkoKSwNCisJICAgICAgICAgICAgdC5nZXRIb3VyKCksDQorCSAgICAgICAgICAgIHQuZ2V0TWludXRlKCksDQorCSAgICAgICAgICAgIHQuZ2V0U2Vjb25kKCksDQorCSAgICAgICAgICAgIHQuZ2V0Wm9uZSgpKTsgICAgLy8gdGltZSB6b25lIG9mZnNldA0KKwl9DQorfQ0KKw0KK1N0cmluZyBkYXlfb2Zfd2VlaygpIDoNCit7fQ0KK3sNCisoICAgICJNb24iIHwgIlR1ZSIgfCAiV2VkIiB8ICJUaHUiIHwgIkZyaSIgfCAiU2F0IiB8ICJTdW4iDQorKQ0KKyAgICB7IHJldHVybiB0b2tlbi5pbWFnZTsgfQ0KK30NCisNCitEYXRlIGRhdGUoKSA6DQore2ludCBkLCBtOyBTdHJpbmcgeTt9DQorew0KKyAgICBkPWRheSgpIG09bW9udGgoKSB5PXllYXIoKQ0KKyAgICB7IHJldHVybiBuZXcgRGF0ZSh5LCBtLCBkKTsgfQ0KK30NCisNCitpbnQgZGF5KCkgOg0KK3tUb2tlbiB0O30NCit7DQorICAgIHQ9PERJR0lUUz4geyByZXR1cm4gcGFyc2VEaWdpdHModCk7IH0NCit9DQorDQoraW50IG1vbnRoKCkgOg0KK3t9DQorew0KKyAgICAiSmFuIiB7IHJldHVybiAxOyB9DQorfCAgICJGZWIiIHsgcmV0dXJuIDI7IH0NCit8ICAgIk1hciIgeyByZXR1cm4gMzsgfQ0KK3wgICAiQXByIiB7IHJldHVybiA0OyB9DQorfCAgICJNYXkiIHsgcmV0dXJuIDU7IH0NCit8ICAgIkp1biIgeyByZXR1cm4gNjsgfQ0KK3wgICAiSnVsIiB7IHJldHVybiA3OyB9DQorfCAgICJBdWciIHsgcmV0dXJuIDg7IH0NCit8ICAgIlNlcCIgeyByZXR1cm4gOTsgfQ0KK3wgICAiT2N0IiB7IHJldHVybiAxMDsgfQ0KK3wgICAiTm92IiB7IHJldHVybiAxMTsgfQ0KK3wgICAiRGVjIiB7IHJldHVybiAxMjsgfQ0KK30NCisNCitTdHJpbmcgeWVhcigpIDoNCit7VG9rZW4gdDt9DQorew0KKyAgICB0PTxESUdJVFM+IHsgcmV0dXJuIHQuaW1hZ2U7IH0NCit9DQorDQorVGltZSB0aW1lKCkgOg0KK3tpbnQgaCwgbSwgcz0wLCB6O30NCit7DQorICAgIGg9aG91cigpICI6IiBtPW1pbnV0ZSgpIFsgIjoiIHM9c2Vjb25kKCkgXSB6PXpvbmUoKQ0KKyAgICB7IHJldHVybiBuZXcgVGltZShoLCBtLCBzLCB6KTsgfQ0KK30NCisNCitpbnQgaG91cigpIDoNCit7VG9rZW4gdDt9DQorew0KKyAgICB0PTxESUdJVFM+IHsgcmV0dXJuIHBhcnNlRGlnaXRzKHQpOyB9DQorfQ0KKw0KK2ludCBtaW51dGUoKSA6DQore1Rva2VuIHQ7fQ0KK3sNCisgICAgdD08RElHSVRTPiB7IHJldHVybiBwYXJzZURpZ2l0cyh0KTsgfQ0KK30NCisNCitpbnQgc2Vjb25kKCkgOg0KK3tUb2tlbiB0O30NCit7DQorICAgIHQ9PERJR0lUUz4geyByZXR1cm4gcGFyc2VEaWdpdHModCk7IH0NCit9DQorDQoraW50IHpvbmUoKSA6DQoreyBUb2tlbiB0LCB1OyBpbnQgejsgfQ0KK3sNCisoICAgIHQ9PCBPRkZTRVRESVI6IFsiKyIsICItIl0gPiB1PTxESUdJVFM+IHsgej1wYXJzZURpZ2l0cyh1KSoodC5pbWFnZS5lcXVhbHMoIi0iKSA/IC0xIDogMSk7IH0NCit8ICAgej1vYnNfem9uZSgpDQorKQ0KKyAgICB7IHJldHVybiB6OyB9DQorfQ0KKw0KK2ludCBvYnNfem9uZSgpIDoNCit7VG9rZW4gdDsgaW50IHo7fQ0KK3sNCisoICAgIlVUIiAgeyB6PTA7IH0NCit8ICAgIkdNVCIgeyB6PTA7IH0NCit8ICAgIkVTVCIgeyB6PS01OyB9DQorfCAgICJFRFQiIHsgej0tNDsgfQ0KK3wgICAiQ1NUIiB7IHo9LTY7IH0NCit8ICAgIkNEVCIgeyB6PS01OyB9DQorfCAgICJNU1QiIHsgej0tNzsgfQ0KK3wgICAiTURUIiB7IHo9LTY7IH0NCit8ICAgIlBTVCIgeyB6PS04OyB9DQorfCAgICJQRFQiIHsgej0tNzsgfQ0KK3wgICB0PTwgTUlMSVRBUllfWk9ORTogWyJBIi0iSSIsImEiLSJpIiwiSyItIloiLCJrIi0ieiJdID4geyB6PWdldE1pbGl0YXJ5Wm9uZU9mZnNldCh0LmltYWdlLmNoYXJBdCgwKSk7IH0NCispDQorICAgIHsgcmV0dXJuIHogKiAxMDA7IH0NCit9DQorDQorU1BFQ0lBTF9UT0tFTiA6DQorew0KKyAJPCBXUzogKCBbIiAiLCAiXHQiXSApKyA+DQorfQ0KKw0KK1RPS0VOX01HUl9ERUNMUyA6DQorew0KKwkvLyBLZWVwcyB0cmFjayBvZiBob3cgbWFueSBsZXZlbHMgb2YgY29tbWVudCBuZXN0aW5nDQorCS8vIHdlJ3ZlIGVuY291bnRlcmVkLiAgVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgMm5kDQorCS8vIGxldmVsIGlzIHJlYWNoZWQsIGZvciBleGFtcGxlICgodGhpcykpLCBub3QgKHRoaXMpLg0KKwkvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIG91dGVybW9zdCBsZXZlbCBtdXN0IGJlIHRyZWF0ZWQNCisJLy8gc3BlY2lhbGx5IGFueXdheSwgYmVjYXVzZSB0aGUgb3V0ZXJtb3N0ICIpIiBoYXMgYQ0KKwkvLyBkaWZmZXJlbnQgdG9rZW4gdHlwZSB0aGFuIGlubmVyICIpIiBpbnN0YW5jZXMuDQorCXN0YXRpYyBpbnQgY29tbWVudE5lc3Q7DQorfQ0KKw0KK01PUkUgOg0KK3sNCisJLy8gc3RhcnRzIGEgY29tbWVudA0KKwkiKCIgOiBJTkNPTU1FTlQNCit9DQorDQorPElOQ09NTUVOVD4NCitTS0lQIDoNCit7DQorCS8vIGVuZHMgYSBjb21tZW50DQorCTwgQ09NTUVOVDogIikiID4gOiBERUZBVUxUDQorCS8vIGlmIHRoaXMgaXMgZXZlciBjaGFuZ2VkIHRvIG5vdCBiZSBhIFNLSVAsIG5lZWQNCisJLy8gdG8gbWFrZSBzdXJlIG1hdGNoZWRUb2tlbi50b2tlbiA9IHRva2VuLnRvU3RyaW5nKCkNCisJLy8gaXMgY2FsbGVkLg0KK30NCisNCis8SU5DT01NRU5UPg0KK01PUkUgOg0KK3sNCisJPCA8UVVPVEVEUEFJUj4+IHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMik7IH0NCit8CSIoIiB7IGNvbW1lbnROZXN0ID0gMTsgfSA6IE5FU1RFRF9DT01NRU5UDQorfAk8IDxBTlk+Pg0KK30NCisNCis8TkVTVEVEX0NPTU1FTlQ+DQorTU9SRSA6DQorew0KKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQ0KK3wJIigiIHsgKytjb21tZW50TmVzdDsgfQ0KK3wJIikiIHsgLS1jb21tZW50TmVzdDsgaWYgKGNvbW1lbnROZXN0ID09IDApIFN3aXRjaFRvKElOQ09NTUVOVCk7IH0NCit8CTwgPEFOWT4+DQorfQ0KKw0KK1RPS0VOIDoNCit7DQorICAgIDwgRElHSVRTOiAoIFsiMCItIjkiXSApKyA+DQorfQ0KKw0KKy8vIEdMT0JBTFMNCisNCis8Kj4NCitUT0tFTiA6DQorew0KKwk8ICNRVU9URURQQUlSOiAiXFwiIDxBTlk+ID4NCit8CTwgI0FOWTogfltdID4NCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2RhdGV0aW1lL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvZGF0ZXRpbWUvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjhjZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2RhdGV0aW1lL1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5kYXRldGltZS5wYXJzZXI7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gcGFyc2UgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4KKyAqIFlvdSBjYW4gZXhwbGljaXRseSBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGV4Y2VwdGlvbiB0eXBlIGJ5CisgKiBjYWxsaW5nIHRoZSBtZXRob2QgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiBpbiB0aGUgZ2VuZXJhdGVkCisgKiBwYXJzZXIuCisgKgorICogQ2hhbmdlcyBmb3IgTWltZTRKOgorICogICBleHRlbmRzIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLlBhcnNlRXhjZXB0aW9uCisgKiAgIGFkZGVkIHNlcmlhbFZlcnNpb25VSUQKKyAqICAgYWRkZWQgY29uc3RydWN0b3IgUGFyc2VFeGNlcHRpb24oVGhyb3dhYmxlKQorICogICBkZWZhdWx0IGRldGFpbCBtZXNzYWdlIGlzICJDYW5ub3QgcGFyc2UgZmllbGQiCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLlBhcnNlRXhjZXB0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcworICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4gIFRoZSBib29sZWFuCisgICAqIGZsYWcgInNwZWNpYWxDb25zdHJ1Y3RvciIgaXMgYWxzbyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0CisgICAqIHRoaXMgY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0LgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGl0cyBzdXBlciBjbGFzcyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKKyAgICogdG8gZm9yY2UgdGhlICJ0b1N0cmluZyIgbWV0aG9kIG9mIHBhcmVudCBjbGFzcyAiVGhyb3dhYmxlIiB0bworICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKKyAgICogICAgIFBhcnNlRXhjZXB0aW9uOiA8cmVzdWx0IG9mIGdldE1lc3NhZ2U+CisgICAqLworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAorICAgICAgICAgICAgICAgICAgICAgICApCisgIHsKKyAgICBzdXBlcigiIik7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7CisgICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7CisgICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgorICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCisgICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCisgICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCisgICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgorICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCisgICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KKyAgICovCisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCJDYW5ub3QgcGFyc2UgZmllbGQiKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihjYXVzZSk7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hpY2ggY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlCisgICAqIHRoaXMgb2JqZWN0IGFuZCB0aGVyZWJ5IGFmZmVjdHMgdGhlIHNlbWFudGljcyBvZiB0aGUKKyAgICogImdldE1lc3NhZ2UiIG1ldGhvZCAoc2VlIGJlbG93KS4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHNwZWNpYWxDb25zdHJ1Y3RvcjsKKworICAvKioKKyAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCisgICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgorICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgorICAgKi8KKyAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKKworICAvKioKKyAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQorICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCisgICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KKyAgICovCisgIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCisgICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcworICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIHdoZW4gdGhpcyBvYmplY3QgaGFzIGJlZW4KKyAgICogY3JlYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3JzLiAgT3RoZXJ3aXNlLCBpdCB1c2VzCisgICAqICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQorICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAorICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCisgICAqIGZyb20gdGhlIHBhcnNlciksIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJpbnRpbmcKKyAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQorICAgKiBnZXRzIGRpc3BsYXllZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikgeworICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICB9CisgICAgU3RyaW5nQnVmZmVyIGV4cGVjdGVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGludCBtYXhTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKKyAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCh0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dKS5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKyAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQoIi4uLiIpOworICAgICAgfQorICAgICAgZXhwZWN0ZWQuYXBwZW5kKGVvbCkuYXBwZW5kKCIgICAgIik7CisgICAgfQorICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOworICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOworICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7CisgICAgICB0b2sgPSB0b2submV4dDsgCisgICAgfQorICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkNvbHVtbjsKKyAgICByZXR2YWwgKz0gIi4iICsgZW9sOworICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmc6IiArIGVvbCArICIgICAgIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOworICAgIH0KKyAgICByZXR2YWwgKz0gZXhwZWN0ZWQudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gcmV0dmFsOworICB9CisKKyAgLyoqCisgICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOworIAorICAvKioKKyAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgorICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKKyAgICogc3RyaW5nIGxpdGVyYWwuCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBjaGFyIGNoOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgY2FzZSAwIDoKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKKyAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOworICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvbGFuZ3VhZ2UvQ29udGVudExhbmd1YWdlUGFyc2VyLmpqIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2xhbmd1YWdlL0NvbnRlbnRMYW5ndWFnZVBhcnNlci5qagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NThmZTMwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2xhbmd1YWdlL0NvbnRlbnRMYW5ndWFnZVBhcnNlci5qagpAQCAtMCwwICsxLDIwOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK29wdGlvbnMgew0KKyAgc3RhdGljPWZhbHNlOw0KKyAgSkRLX1ZFUlNJT04gPSAiMS41IjsNCisgIE9VVFBVVF9ESVJFQ1RPUlkgPSAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2phdmFjYyI7DQorfQ0KKw0KK1BBUlNFUl9CRUdJTihDb250ZW50TGFuZ3VhZ2VQYXJzZXIpDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQubGFuZ3VhZ2UucGFyc2VyOworDQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK3B1YmxpYyBjbGFzcyBDb250ZW50TGFuZ3VhZ2VQYXJzZXIgew0KKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBsYW5ndWFnZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsNCisJDQorCS8qKg0KKwkgKiBQYXJzZXMgdGhlIGlucHV0IGludG8gYSBsaXN0IG9mIGxhbmd1YWdlIHRhZ3MuDQorCSAqIEByZXR1cm4gbGlzdCBvZiBsYW5ndWFnZSB0YWcgU3RyaW5ncw0KKwkgKi8NCisJcHVibGljIExpc3Q8U3RyaW5nPiBwYXJzZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorCQl0cnkgew0KKwkJCXJldHVybiBkb1BhcnNlKCk7DQorCQl9IGNhdGNoIChUb2tlbk1nckVycm9yIGUpIHsNCisJCQkvLyBBbiBpc3N1ZSB3aXRoIHRoZSBUT0tFTmlzZXIgDQorCQkJLy8gYnV0IGl0J3Mgbm90IHBvbGl0ZSB0byB0aHJvdyBhbiBFcnJvcg0KKwkJCS8vIHdoZW4gZXhlY3V0aW5nIG9uIGEgc2VydmVyDQorCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKGUpOw0KKwkJfQ0KKwl9DQorfQ0KK1BBUlNFUl9FTkQoQ29udGVudExhbmd1YWdlUGFyc2VyKQ0KKw0KK3ByaXZhdGUgTGlzdDxTdHJpbmc+IGRvUGFyc2UoKSA6DQorew0KK30NCit7DQorCWxhbmd1YWdlKCkgKCAiLCIgbGFuZ3VhZ2UoKSApKg0KKwl7cmV0dXJuIGxhbmd1YWdlczt9DQorfQ0KKw0KK1N0cmluZyBsYW5ndWFnZSgpIDoNCit7DQorCVRva2VuIHRva2VuOw0KKwlTdHJpbmdCdWZmZXIgbGFuZ3VhZ2VUYWcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQorCVN0cmluZyByZXN1bHQ7DQorfQ0KK3sNCisJdG9rZW4gPSA8QUxQSEE+IA0KKwkJCXsNCisJCQkJbGFuZ3VhZ2VUYWcuYXBwZW5kKHRva2VuLmltYWdlKTsNCisJCQl9DQorCQkoIA0KKwkJIi0iIA0KKy8vIFRoaXMga2VlcHMgVE9LRU5pc2luZyBzaW1wbGUNCisJCQkJdG9rZW4gPSA8QUxQSEE+IA0KKwkJCQkJew0KKwkJCQkJCWxhbmd1YWdlVGFnLmFwcGVuZCgnLScpOw0KKwkJCQkJCWxhbmd1YWdlVGFnLmFwcGVuZCh0b2tlbi5pbWFnZSk7DQorCQkJCQl9DQorCQkJCXwNCisJCQkJdG9rZW4gPSA8QUxQSEFOVU0+IA0KKwkJCQkJew0KKwkJCQkJCWxhbmd1YWdlVGFnLmFwcGVuZCgnLScpOw0KKwkJCQkJCWxhbmd1YWdlVGFnLmFwcGVuZCh0b2tlbi5pbWFnZSk7DQorCQkJCQl9DQorCQkpKg0KKwkNCisJew0KKwkJcmVzdWx0ID0gbGFuZ3VhZ2VUYWcudG9TdHJpbmcoKTsNCisJCWxhbmd1YWdlcy5hZGQocmVzdWx0KTsNCisJCXJldHVybiByZXN1bHQ7DQorCX0NCit9DQorDQorDQorDQorDQorU1BFQ0lBTF9UT0tFTiA6DQorew0KKyAJPCBXUzogKCBbIiAiLCAiXHQiLCAiXHIiLCAiXG4iXSApKyA+DQorfQ0KKw0KK1RPS0VOX01HUl9ERUNMUyA6DQorew0KKwkvLyBLZWVwcyB0cmFjayBvZiBob3cgbWFueSBsZXZlbHMgb2YgY29tbWVudCBuZXN0aW5nDQorCS8vIHdlJ3ZlIGVuY291bnRlcmVkLiAgVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgMm5kDQorCS8vIGxldmVsIGlzIHJlYWNoZWQsIGZvciBleGFtcGxlICgodGhpcykpLCBub3QgKHRoaXMpLg0KKwkvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIG91dGVybW9zdCBsZXZlbCBtdXN0IGJlIHRyZWF0ZWQNCisJLy8gc3BlY2lhbGx5IGFueXdheSwgYmVjYXVzZSB0aGUgb3V0ZXJtb3N0ICIpIiBoYXMgYQ0KKwkvLyBkaWZmZXJlbnQgdG9rZW4gdHlwZSB0aGFuIGlubmVyICIpIiBpbnN0YW5jZXMuDQorCWludCBjb21tZW50TmVzdDsNCit9DQorDQorDQorTU9SRSA6DQorew0KKwkvLyBzdGFydHMgYSBjb21tZW50DQorCSIoIiA6IElOQ09NTUVOVA0KK30NCisNCis8SU5DT01NRU5UPg0KK1NLSVAgOg0KK3sNCisJLy8gZW5kcyBhIGNvbW1lbnQNCisJPCBDT01NRU5UOiAiKSIgPiA6IERFRkFVTFQNCisJLy8gaWYgdGhpcyBpcyBldmVyIGNoYW5nZWQgdG8gbm90IGJlIGEgU0tJUCwgbmVlZA0KKwkvLyB0byBtYWtlIHN1cmUgbWF0Y2hlZFRva2VuLnRva2VuID0gdG9rZW4udG9TdHJpbmcoKQ0KKwkvLyBpcyBjYWxsZWQuDQorfQ0KKw0KKzxJTkNPTU1FTlQ+DQorTU9SRSA6DQorew0KKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQ0KK3wJIigiIHsgY29tbWVudE5lc3QgPSAxOyB9IDogTkVTVEVEX0NPTU1FTlQNCit8CTwgPEFOWT4+DQorfQ0KKw0KKzxORVNURURfQ09NTUVOVD4NCitNT1JFIDoNCit7DQorCTwgPFFVT1RFRFBBSVI+PiB7IGltYWdlLmRlbGV0ZUNoYXJBdChpbWFnZS5sZW5ndGgoKSAtIDIpOyB9DQorfAkiKCIgeyArK2NvbW1lbnROZXN0OyB9DQorfAkiKSIgeyAtLWNvbW1lbnROZXN0OyBpZiAoY29tbWVudE5lc3QgPT0gMCkgU3dpdGNoVG8oSU5DT01NRU5UKTsgfQ0KK3wJPCA8QU5ZPj4NCit9DQorLy8gUVVPVEVEIFNUUklOR1MNCisNCitNT1JFIDoNCit7DQorCSJcIiIgeyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAxKTsgfSA6IElOUVVPVEVEU1RSSU5HDQorfQ0KKw0KKzxJTlFVT1RFRFNUUklORz4NCitNT1JFIDoNCit7DQorCTwgPFFVT1RFRFBBSVI+PiB7IGltYWdlLmRlbGV0ZUNoYXJBdChpbWFnZS5sZW5ndGgoKSAtIDIpOyB9DQorfAk8ICh+WyJcIiIsICJcXCJdKSsgPg0KK30NCisNCis8SU5RVU9URURTVFJJTkc+DQorVE9LRU4gOg0KK3sNCisJPCBRVU9URURTVFJJTkc6ICJcIiIgPiB7IG1hdGNoZWRUb2tlbi5pbWFnZSA9IGltYWdlLnN1YnN0cmluZygwLCBpbWFnZS5sZW5ndGgoKSAtIDEpOyB9IDogREVGQVVMVA0KK30NCisNCitUT0tFTiA6DQorew0KKwk8IERJR0lUUzogKCBbIjAiLSI5Il0gKSsgPg0KK30NCisNCitUT0tFTiA6DQorew0KKwk8IEFMUEhBOiAoIFsiYSItInoiXSB8IFsiQSItIloiXSApKyA+DQorfQ0KKw0KK1RPS0VOIDoNCit7DQorCTxBTFBIQU5VTSA6ICggIFsiMCItIjkiXSB8ICBbImEiLSJ6Il0gfCBbIkEiLSJaIl0gKSs+DQorfQ0KKw0KK1RPS0VOIDoNCit7DQorCTwgRE9UOiAiLiIgPg0KK30NCisNCis8Kj4NCitUT0tFTiA6DQorew0KKwk8ICNRVU9URURQQUlSOiAiXFwiIDxBTlk+ID4NCit8CTwgI0FOWTogfltdID4NCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2xhbmd1YWdlL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvbGFuZ3VhZ2UvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzY4NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamF2YWNjL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2xhbmd1YWdlL1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMjAgQEAKKy8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5sYW5ndWFnZS5wYXJzZXI7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gcGFyc2UgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4KKyAqIFlvdSBjYW4gZXhwbGljaXRseSBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGV4Y2VwdGlvbiB0eXBlIGJ5CisgKiBjYWxsaW5nIHRoZSBtZXRob2QgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiBpbiB0aGUgZ2VuZXJhdGVkCisgKiBwYXJzZXIuCisgKgorICogQ2hhbmdlcyBmb3IgTWltZTRKOgorICogICBleHRlbmRzIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLlBhcnNlRXhjZXB0aW9uCisgKiAgIGFkZGVkIHNlcmlhbFZlcnNpb25VSUQKKyAqICAgYWRkZWQgY29uc3RydWN0b3IgUGFyc2VFeGNlcHRpb24oVGhyb3dhYmxlKQorICogICBkZWZhdWx0IGRldGFpbCBtZXNzYWdlIGlzICJDYW5ub3QgcGFyc2UgZmllbGQiCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLlBhcnNlRXhjZXB0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcworICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4gIFRoZSBib29sZWFuCisgICAqIGZsYWcgInNwZWNpYWxDb25zdHJ1Y3RvciIgaXMgYWxzbyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0CisgICAqIHRoaXMgY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0LgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGl0cyBzdXBlciBjbGFzcyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKKyAgICogdG8gZm9yY2UgdGhlICJ0b1N0cmluZyIgbWV0aG9kIG9mIHBhcmVudCBjbGFzcyAiVGhyb3dhYmxlIiB0bworICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKKyAgICogICAgIFBhcnNlRXhjZXB0aW9uOiA8cmVzdWx0IG9mIGdldE1lc3NhZ2U+CisgICAqLworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAorICAgICAgICAgICAgICAgICAgICAgICApCisgIHsKKyAgICBzdXBlcigiIik7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7CisgICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7CisgICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgorICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCisgICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCisgICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCisgICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgorICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCisgICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KKyAgICovCisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCJDYW5ub3QgcGFyc2UgZmllbGQiKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihjYXVzZSk7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hpY2ggY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlCisgICAqIHRoaXMgb2JqZWN0IGFuZCB0aGVyZWJ5IGFmZmVjdHMgdGhlIHNlbWFudGljcyBvZiB0aGUKKyAgICogImdldE1lc3NhZ2UiIG1ldGhvZCAoc2VlIGJlbG93KS4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHNwZWNpYWxDb25zdHJ1Y3RvcjsKKworICAvKioKKyAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCisgICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgorICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgorICAgKi8KKyAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKKworICAvKioKKyAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQorICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCisgICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KKyAgICovCisgIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCisgICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcworICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIHdoZW4gdGhpcyBvYmplY3QgaGFzIGJlZW4KKyAgICogY3JlYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3JzLiAgT3RoZXJ3aXNlLCBpdCB1c2VzCisgICAqICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQorICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAorICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCisgICAqIGZyb20gdGhlIHBhcnNlciksIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJpbnRpbmcKKyAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQorICAgKiBnZXRzIGRpc3BsYXllZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikgeworICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICB9CisgICAgU3RyaW5nQnVmZmVyIGV4cGVjdGVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGludCBtYXhTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKKyAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCh0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dKS5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKyAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQoIi4uLiIpOworICAgICAgfQorICAgICAgZXhwZWN0ZWQuYXBwZW5kKGVvbCkuYXBwZW5kKCIgICAgIik7CisgICAgfQorICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOworICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOworICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7CisgICAgICB0b2sgPSB0b2submV4dDsgCisgICAgfQorICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkNvbHVtbjsKKyAgICByZXR2YWwgKz0gIi4iICsgZW9sOworICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmc6IiArIGVvbCArICIgICAgIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOworICAgIH0KKyAgICByZXR2YWwgKz0gZXhwZWN0ZWQudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gcmV0dmFsOworICB9CisKKyAgLyoqCisgICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOworIAorICAvKioKKyAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgorICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKKyAgICogc3RyaW5nIGxpdGVyYWwuCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBjaGFyIGNoOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgY2FzZSAwIDoKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKKyAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOworICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvbWltZXZlcnNpb24vTWltZVZlcnNpb25QYXJzZXIuamogYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvbWltZXZlcnNpb24vTWltZVZlcnNpb25QYXJzZXIuamoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliNmJiNQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9taW1ldmVyc2lvbi9NaW1lVmVyc2lvblBhcnNlci5qagpAQCAtMCwwICsxLDE3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK29wdGlvbnMgew0KKyAgc3RhdGljPWZhbHNlOw0KKyAgSkRLX1ZFUlNJT04gPSAiMS41IjsNCisgIE9VVFBVVF9ESVJFQ1RPUlkgPSAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2phdmFjYyI7DQorfQ0KKw0KK1BBUlNFUl9CRUdJTihNaW1lVmVyc2lvblBhcnNlcikNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5taW1ldmVyc2lvbi5wYXJzZXI7CisNCitwdWJsaWMgY2xhc3MgTWltZVZlcnNpb25QYXJzZXIgew0KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTklUSUFMX1ZFUlNJT05fVkFMVUUgPSAtMTsNCisJcHJpdmF0ZSBpbnQgbWFqb3I9SU5JVElBTF9WRVJTSU9OX1ZBTFVFOw0KKwlwcml2YXRlIGludCBtaW5vcj1JTklUSUFMX1ZFUlNJT05fVkFMVUU7DQorCQ0KKwlwdWJsaWMgaW50IGdldE1pbm9yVmVyc2lvbigpIHsNCisJCXJldHVybiBtaW5vcjsNCisJfQ0KKwkNCisJcHVibGljIGludCBnZXRNYWpvclZlcnNpb24oKSB7DQorCQlyZXR1cm4gbWFqb3I7DQorCX0NCit9DQorUEFSU0VSX0VORChNaW1lVmVyc2lvblBhcnNlcikNCisNCisNCit2b2lkIHBhcnNlTGluZSgpIDoNCit7fQ0KK3sNCisJcGFyc2UoKSBbIlxyIl0gIlxuIg0KK30NCisNCit2b2lkIHBhcnNlQWxsKCkgOg0KK3t9DQorew0KKwlwYXJzZSgpIDxFT0Y+DQorfQ0KKw0KK3ZvaWQgcGFyc2UoKSA6DQorew0KKwlUb2tlbiBtYWpvcjsNCisJVG9rZW4gbWlub3I7DQorfQ0KK3sNCisJbWFqb3I9PERJR0lUUz4gPERPVD4gbWlub3I9PERJR0lUUz4NCisJew0KKwkJdHJ5IHsNCisJCQl0aGlzLm1ham9yID0gSW50ZWdlci5wYXJzZUludChtYWpvci5pbWFnZSk7DQorCQkJdGhpcy5taW5vciA9IEludGVnZXIucGFyc2VJbnQobWlub3IuaW1hZ2UpOw0KKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsNCisJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOw0KKwkJfQ0KKwl9DQorfQ0KKw0KK1NQRUNJQUxfVE9LRU4gOg0KK3sNCisgCTwgV1M6ICggWyIgIiwgIlx0IiwgIlxyIiwgIlxuIl0gKSsgPg0KK30NCisNCitUT0tFTl9NR1JfREVDTFMgOg0KK3sNCisJLy8gS2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgbGV2ZWxzIG9mIGNvbW1lbnQgbmVzdGluZw0KKwkvLyB3ZSd2ZSBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIDJuZA0KKwkvLyBsZXZlbCBpcyByZWFjaGVkLCBmb3IgZXhhbXBsZSAoKHRoaXMpKSwgbm90ICh0aGlzKS4NCisJLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRlcm1vc3QgbGV2ZWwgbXVzdCBiZSB0cmVhdGVkDQorCS8vIHNwZWNpYWxseSBhbnl3YXksIGJlY2F1c2UgdGhlIG91dGVybW9zdCAiKSIgaGFzIGENCisJLy8gZGlmZmVyZW50IHRva2VuIHR5cGUgdGhhbiBpbm5lciAiKSIgaW5zdGFuY2VzLg0KKwlpbnQgY29tbWVudE5lc3Q7DQorfQ0KKw0KKw0KK01PUkUgOg0KK3sNCisJLy8gc3RhcnRzIGEgY29tbWVudA0KKwkiKCIgOiBJTkNPTU1FTlQNCit9DQorDQorPElOQ09NTUVOVD4NCitTS0lQIDoNCit7DQorCS8vIGVuZHMgYSBjb21tZW50DQorCTwgQ09NTUVOVDogIikiID4gOiBERUZBVUxUDQorCS8vIGlmIHRoaXMgaXMgZXZlciBjaGFuZ2VkIHRvIG5vdCBiZSBhIFNLSVAsIG5lZWQNCisJLy8gdG8gbWFrZSBzdXJlIG1hdGNoZWRUb2tlbi50b2tlbiA9IHRva2VuLnRvU3RyaW5nKCkNCisJLy8gaXMgY2FsbGVkLg0KK30NCisNCis8SU5DT01NRU5UPg0KK01PUkUgOg0KK3sNCisJPCA8UVVPVEVEUEFJUj4+IHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMik7IH0NCit8CSIoIiB7IGNvbW1lbnROZXN0ID0gMTsgfSA6IE5FU1RFRF9DT01NRU5UDQorfAk8IDxBTlk+Pg0KK30NCisNCis8TkVTVEVEX0NPTU1FTlQ+DQorTU9SRSA6DQorew0KKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQ0KK3wJIigiIHsgKytjb21tZW50TmVzdDsgfQ0KK3wJIikiIHsgLS1jb21tZW50TmVzdDsgaWYgKGNvbW1lbnROZXN0ID09IDApIFN3aXRjaFRvKElOQ09NTUVOVCk7IH0NCit8CTwgPEFOWT4+DQorfQ0KKy8vIFFVT1RFRCBTVFJJTkdTDQorDQorTU9SRSA6DQorew0KKwkiXCIiIHsgaW1hZ2UuZGVsZXRlQ2hhckF0KGltYWdlLmxlbmd0aCgpIC0gMSk7IH0gOiBJTlFVT1RFRFNUUklORw0KK30NCisNCis8SU5RVU9URURTVFJJTkc+DQorTU9SRSA6DQorew0KKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQ0KK3wJPCAoflsiXCIiLCAiXFwiXSkrID4NCit9DQorDQorPElOUVVPVEVEU1RSSU5HPg0KK1RPS0VOIDoNCit7DQorCTwgUVVPVEVEU1RSSU5HOiAiXCIiID4geyBtYXRjaGVkVG9rZW4uaW1hZ2UgPSBpbWFnZS5zdWJzdHJpbmcoMCwgaW1hZ2UubGVuZ3RoKCkgLSAxKTsgfSA6IERFRkFVTFQNCit9DQorDQorVE9LRU4gOg0KK3sNCisJPCBESUdJVFM6ICggWyIwIi0iOSJdICkrID4NCit9DQorDQorVE9LRU4gOg0KK3sNCisJPCBET1Q6ICIuIiA+DQorfQ0KKw0KKzwqPg0KK1RPS0VOIDoNCit7DQorCTwgI1FVT1RFRFBBSVI6ICJcXCIgPEFOWT4gPg0KK3wJPCAjQU5ZOiB+W10gPg0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvbWltZXZlcnNpb24vUGFyc2VFeGNlcHRpb24uamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9taW1ldmVyc2lvbi9QYXJzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Yjc0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvbWltZXZlcnNpb24vUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gMy4wICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLm1pbWV2ZXJzaW9uLnBhcnNlcjsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBwYXJzZSBlcnJvcnMgYXJlIGVuY291bnRlcmVkLgorICogWW91IGNhbiBleHBsaWNpdGx5IGNyZWF0ZSBvYmplY3RzIG9mIHRoaXMgZXhjZXB0aW9uIHR5cGUgYnkKKyAqIGNhbGxpbmcgdGhlIG1ldGhvZCBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIGluIHRoZSBnZW5lcmF0ZWQKKyAqIHBhcnNlci4KKyAqCisgKiBDaGFuZ2VzIGZvciBNaW1lNEo6CisgKiAgIGV4dGVuZHMgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuUGFyc2VFeGNlcHRpb24KKyAqICAgYWRkZWQgc2VyaWFsVmVyc2lvblVJRAorICogICBhZGRlZCBjb25zdHJ1Y3RvciBQYXJzZUV4Y2VwdGlvbihUaHJvd2FibGUpCisgKiAgIGRlZmF1bHQgZGV0YWlsIG1lc3NhZ2UgaXMgIkNhbm5vdCBwYXJzZSBmaWVsZCIKKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuUGFyc2VFeGNlcHRpb24geworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgIC8qKgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIG1ldGhvZCAiZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiIKKyAgICogaW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIuICBDYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZ2VuZXJhdGVzCisgICAqIGEgbmV3IG9iamVjdCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgZmllbGRzICJjdXJyZW50VG9rZW4iLAorICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgc2V0LiAgVGhlIGJvb2xlYW4KKyAgICogZmxhZyAic3BlY2lhbENvbnN0cnVjdG9yIiBpcyBhbHNvIHNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQKKyAgICogdGhpcyBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QuCisgICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgaXRzIHN1cGVyIGNsYXNzIHdpdGggdGhlIGVtcHR5IHN0cmluZworICAgKiB0byBmb3JjZSB0aGUgInRvU3RyaW5nIiBtZXRob2Qgb2YgcGFyZW50IGNsYXNzICJUaHJvd2FibGUiIHRvCisgICAqIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBmb3JtOgorICAgKiAgICAgUGFyc2VFeGNlcHRpb246IDxyZXN1bHQgb2YgZ2V0TWVzc2FnZT4KKyAgICovCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsCisgICAgICAgICAgICAgICAgICAgICAgICkKKyAgeworICAgIHN1cGVyKCIiKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSB0cnVlOworICAgIGN1cnJlbnRUb2tlbiA9IGN1cnJlbnRUb2tlblZhbDsKKyAgICBleHBlY3RlZFRva2VuU2VxdWVuY2VzID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbDsKKyAgICB0b2tlbkltYWdlID0gdG9rZW5JbWFnZVZhbDsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9ycyBhcmUgZm9yIHVzZSBieSB5b3UgZm9yIHdoYXRldmVyCisgICAqIHB1cnBvc2UgeW91IGNhbiB0aGluayBvZi4gIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKKyAgICogbWFubmVyIG1ha2VzIHRoZSBleGNlcHRpb24gYmVoYXZlIGluIHRoZSBub3JtYWwgd2F5IC0gaS5lLiwgYXMKKyAgICogZG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgIlRocm93YWJsZSIuICBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIGRvIG5vdCBjb250YWluCisgICAqIHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKKyAgICogdGhlc2UgY29uc3RydWN0b3JzLgorICAgKi8KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oKSB7CisgICAgc3VwZXIoIkNhbm5vdCBwYXJzZSBmaWVsZCIpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOworICB9CisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgIHN1cGVyKGNhdXNlKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOworICB9CisKKyAgLyoqCisgICAqIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGljaCBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUKKyAgICogdGhpcyBvYmplY3QgYW5kIHRoZXJlYnkgYWZmZWN0cyB0aGUgc2VtYW50aWNzIG9mIHRoZQorICAgKiAiZ2V0TWVzc2FnZSIgbWV0aG9kIChzZWUgYmVsb3cpLgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lhbENvbnN0cnVjdG9yOworCisgIC8qKgorICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKKyAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCisgICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCisgICAqLworICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOworCisgIC8qKgorICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5CisgICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKKyAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgorICAgKi8KKyAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKKworICAvKioKKyAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKKyAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCisgICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgorICAgKi8KKyAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7CisKKyAgLyoqCisgICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc3RhbmRhcmQgYmVoYXZpb3Igd2hlbiB0aGlzIG9iamVjdCBoYXMgYmVlbgorICAgKiBjcmVhdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvcnMuICBPdGhlcndpc2UsIGl0IHVzZXMKKyAgICogImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCisgICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCisgICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KKyAgICogZnJvbSB0aGUgcGFyc2VyKSwgdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBwcmludGluZworICAgKiBvZiB0aGUgZmluYWwgc3RhY2sgdHJhY2UsIGFuZCBoZW5jZSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCisgICAqIGdldHMgZGlzcGxheWVkLgorICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgIGlmICghc3BlY2lhbENvbnN0cnVjdG9yKSB7CisgICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKyAgICBTdHJpbmdCdWZmZXIgZXhwZWN0ZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgaW50IG1heFNpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7IGkrKykgeworICAgICAgaWYgKG1heFNpemUgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCkgeworICAgICAgICBtYXhTaXplID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7CisgICAgICB9CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKHRva2VuSW1hZ2VbZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtqXV0pLmFwcGVuZCgiICIpOworICAgICAgfQorICAgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGggLSAxXSAhPSAwKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCgiLi4uIik7CisgICAgICB9CisgICAgICBleHBlY3RlZC5hcHBlbmQoZW9sKS5hcHBlbmQoIiAgICAiKTsKKyAgICB9CisgICAgU3RyaW5nIHJldHZhbCA9ICJFbmNvdW50ZXJlZCBcIiI7CisgICAgVG9rZW4gdG9rID0gY3VycmVudFRva2VuLm5leHQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTaXplOyBpKyspIHsKKyAgICAgIGlmIChpICE9IDApIHJldHZhbCArPSAiICI7CisgICAgICBpZiAodG9rLmtpbmQgPT0gMCkgeworICAgICAgICByZXR2YWwgKz0gdG9rZW5JbWFnZVswXTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR2YWwgKz0gYWRkX2VzY2FwZXModG9rLmltYWdlKTsKKyAgICAgIHRvayA9IHRvay5uZXh0OyAKKyAgICB9CisgICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOworICAgIHJldHZhbCArPSAiLiIgKyBlb2w7CisgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKKyAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOworICAgIH0gZWxzZSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7CisgICAgfQorICAgIHJldHZhbCArPSBleHBlY3RlZC50b1N0cmluZygpOworICAgIHJldHVybiByZXR2YWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7CisgCisgIC8qKgorICAgKiBVc2VkIHRvIGNvbnZlcnQgcmF3IGNoYXJhY3RlcnMgdG8gdGhlaXIgZXNjYXBlZCB2ZXJzaW9uCisgICAqIHdoZW4gdGhlc2UgcmF3IHZlcnNpb24gY2Fubm90IGJlIHVzZWQgYXMgcGFydCBvZiBhbiBBU0NJSQorICAgKiBzdHJpbmcgbGl0ZXJhbC4KKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgYWRkX2VzY2FwZXMoU3RyaW5nIHN0cikgeworICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgIGNoYXIgY2g7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKKyAgICAgICAgeworICAgICAgICAgICBjYXNlIDAgOgorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1x0JzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXGYnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgeworICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7CisgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9zdHJ1Y3R1cmVkL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvc3RydWN0dXJlZC9QYXJzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YzkzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvc3RydWN0dXJlZC9QYXJzZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFBhcnNlRXhjZXB0aW9uLmphdmEgVmVyc2lvbiAzLjAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuc3RydWN0dXJlZC5wYXJzZXI7CisKKy8qKgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gcGFyc2UgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4KKyAqIFlvdSBjYW4gZXhwbGljaXRseSBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGV4Y2VwdGlvbiB0eXBlIGJ5CisgKiBjYWxsaW5nIHRoZSBtZXRob2QgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiBpbiB0aGUgZ2VuZXJhdGVkCisgKiBwYXJzZXIuCisgKgorICogQ2hhbmdlcyBmb3IgTWltZTRKOgorICogICBleHRlbmRzIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLlBhcnNlRXhjZXB0aW9uCisgKiAgIGFkZGVkIHNlcmlhbFZlcnNpb25VSUQKKyAqICAgYWRkZWQgY29uc3RydWN0b3IgUGFyc2VFeGNlcHRpb24oVGhyb3dhYmxlKQorICogICBkZWZhdWx0IGRldGFpbCBtZXNzYWdlIGlzICJDYW5ub3QgcGFyc2UgZmllbGQiCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLlBhcnNlRXhjZXB0aW9uIHsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAvKioKKyAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCisgICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcworICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKKyAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4gIFRoZSBib29sZWFuCisgICAqIGZsYWcgInNwZWNpYWxDb25zdHJ1Y3RvciIgaXMgYWxzbyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0CisgICAqIHRoaXMgY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0LgorICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGl0cyBzdXBlciBjbGFzcyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKKyAgICogdG8gZm9yY2UgdGhlICJ0b1N0cmluZyIgbWV0aG9kIG9mIHBhcmVudCBjbGFzcyAiVGhyb3dhYmxlIiB0bworICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKKyAgICogICAgIFBhcnNlRXhjZXB0aW9uOiA8cmVzdWx0IG9mIGdldE1lc3NhZ2U+CisgICAqLworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAorICAgICAgICAgICAgICAgICAgICAgICApCisgIHsKKyAgICBzdXBlcigiIik7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gdHJ1ZTsKKyAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7CisgICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7CisgICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7CisgIH0KKworICAvKioKKyAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgorICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCisgICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCisgICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCisgICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgorICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCisgICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KKyAgICovCisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKCJDYW5ub3QgcGFyc2UgZmllbGQiKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICBzdXBlcihjYXVzZSk7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICBzdXBlcihtZXNzYWdlKTsKKyAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKKyAgfQorCisgIC8qKgorICAgKiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hpY2ggY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlCisgICAqIHRoaXMgb2JqZWN0IGFuZCB0aGVyZWJ5IGFmZmVjdHMgdGhlIHNlbWFudGljcyBvZiB0aGUKKyAgICogImdldE1lc3NhZ2UiIG1ldGhvZCAoc2VlIGJlbG93KS4KKyAgICovCisgIHByb3RlY3RlZCBib29sZWFuIHNwZWNpYWxDb25zdHJ1Y3RvcjsKKworICAvKioKKyAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCisgICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgorICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgorICAgKi8KKyAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKKworICAvKioKKyAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQorICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCisgICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KKyAgICovCisgIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCisgICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcworICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KKyAgICovCisgIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOworCisgIC8qKgorICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIHdoZW4gdGhpcyBvYmplY3QgaGFzIGJlZW4KKyAgICogY3JlYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3JzLiAgT3RoZXJ3aXNlLCBpdCB1c2VzCisgICAqICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQorICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAorICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCisgICAqIGZyb20gdGhlIHBhcnNlciksIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJpbnRpbmcKKyAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQorICAgKiBnZXRzIGRpc3BsYXllZC4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikgeworICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKKyAgICB9CisgICAgU3RyaW5nQnVmZmVyIGV4cGVjdGVkID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIGludCBtYXhTaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpIHsKKyAgICAgICAgbWF4U2l6ZSA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOworICAgICAgfQorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKSB7CisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCh0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dKS5hcHBlbmQoIiAiKTsKKyAgICAgIH0KKyAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQoIi4uLiIpOworICAgICAgfQorICAgICAgZXhwZWN0ZWQuYXBwZW5kKGVvbCkuYXBwZW5kKCIgICAgIik7CisgICAgfQorICAgIFN0cmluZyByZXR2YWwgPSAiRW5jb3VudGVyZWQgXCIiOworICAgIFRva2VuIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4U2l6ZTsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKSByZXR2YWwgKz0gIiAiOworICAgICAgaWYgKHRvay5raW5kID09IDApIHsKKyAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dmFsICs9IGFkZF9lc2NhcGVzKHRvay5pbWFnZSk7CisgICAgICB0b2sgPSB0b2submV4dDsgCisgICAgfQorICAgIHJldHZhbCArPSAiXCIgYXQgbGluZSAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5MaW5lICsgIiwgY29sdW1uICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkNvbHVtbjsKKyAgICByZXR2YWwgKz0gIi4iICsgZW9sOworICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aCA9PSAxKSB7CisgICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmc6IiArIGVvbCArICIgICAgIjsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nIG9uZSBvZjoiICsgZW9sICsgIiAgICAiOworICAgIH0KKyAgICByZXR2YWwgKz0gZXhwZWN0ZWQudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gcmV0dmFsOworICB9CisKKyAgLyoqCisgICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KKyAgICovCisgIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOworIAorICAvKioKKyAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgorICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKKyAgICogc3RyaW5nIGxpdGVyYWwuCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpIHsKKyAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICBjaGFyIGNoOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgY2FzZSAwIDoKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcdCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xmJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcJyc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xcJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKKyAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7CisgICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOworICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvc3RydWN0dXJlZC9TdHJ1Y3R1cmVkRmllbGRQYXJzZXIuamogYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhY2Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvc3RydWN0dXJlZC9TdHJ1Y3R1cmVkRmllbGRQYXJzZXIuamoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmN2M5NAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFjYy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9zdHJ1Y3R1cmVkL1N0cnVjdHVyZWRGaWVsZFBhcnNlci5qagpAQCAtMCwwICsxLDIyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK29wdGlvbnMgew0KKyAgc3RhdGljPWZhbHNlOw0KKyAgSkRLX1ZFUlNJT04gPSAiMS41IjsNCisgIE9VVFBVVF9ESVJFQ1RPUlkgPSAiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL2phdmFjYyI7DQorICAvL0RFQlVHX1BBUlNFUiA9IHRydWU7DQorICAvL0RFQlVHX1RPS0VOX01BTkFHRVIgPSB0cnVlOw0KK30NCisNCitQQVJTRVJfQkVHSU4oU3RydWN0dXJlZEZpZWxkUGFyc2VyKQ0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLnN0cnVjdHVyZWQucGFyc2VyOw0KKw0KKy8qKg0KKyAqIFBhcnNlcyBnZW5lcmljIHN0cnVjdHVyZSBmaWVsZHMuDQorICogVW5mb2xkcyBhbmQgcmVtb3ZlcyBjb21tZW50cy4NCisgKi8NCitwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZpZWxkUGFyc2VyIHsNCisJDQorCXByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZUZvbGRpbmcgPSBmYWxzZTsNCisJDQorCS8qKg0KKwkgKiBTaG91bGQgdGhlIFxyXG4gZm9sZGluZyBzZXF1ZW5jZSBiZSBwcmVzZXJ2ZWQ/DQorCSAqLw0KKwlwdWJsaWMgYm9vbGVhbiBpc0ZvbGRpbmdQcmVzZXJ2ZWQoKSB7DQorCQlyZXR1cm4gcHJlc2VydmVGb2xkaW5nOw0KKwl9DQorCQ0KKwkvKioNCisJICogU2V0cyB3aGV0aGVyIHRoZSBcclxuIGZvbGRpbmcgc2VxdWVuY2Ugc2hvdWxkIGJlIHByZXNlcnZlZC4NCisJICovDQorCXB1YmxpYyB2b2lkIHNldEZvbGRpbmdQcmVzZXJ2ZWQoYm9vbGVhbiBwcmVzZXJ2ZUZvbGRpbmcpIHsNCisJCXRoaXMucHJlc2VydmVGb2xkaW5nID0gIHByZXNlcnZlRm9sZGluZzsNCisJfQ0KKwkNCisJLyoqDQorCSAqIFVuZm9sZHMgdGhlIGlucHV0IGFuZCByZW1vdmVzIGNvbW1lbnRzLg0KKwkgKiBAcmV0dXJuIHVuZm9sZGVkIGhlYWRlciB2YWx1ZSB3aXRoIGNvbW1lbnRzIHJlbW92ZWQNCisJICovDQorCXB1YmxpYyBTdHJpbmcgcGFyc2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gew0KKwkJdHJ5IHsNCisJCQlyZXR1cm4gZG9QYXJzZSgpOw0KKwkJfSBjYXRjaCAoVG9rZW5NZ3JFcnJvciBlKSB7DQorCQkJLy8gQW4gaXNzdWUgd2l0aCB0aGUgVE9LRU5pc2VyIA0KKwkJCS8vIGJ1dCBpdCdzIG5vdCBwb2xpdGUgdG8gdGhyb3cgYW4gRXJyb3INCisJCQkvLyB3aGVuIGV4ZWN1dGluZyBvbiBhIHNlcnZlcg0KKwkJCXRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihlKTsNCisJCX0NCisJfQ0KK30NCitQQVJTRVJfRU5EKFN0cnVjdHVyZWRGaWVsZFBhcnNlcikNCisNCitwcml2YXRlIFN0cmluZyBkb1BhcnNlKCkgOg0KK3sNCisJVG9rZW4gdDsNCisJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoNTApOw0KKwlib29sZWFuIHdoaXRlc3BhY2UgPSBmYWxzZTsNCisJYm9vbGVhbiBmaXJzdCA9IHRydWU7DQorfQ0KK3sNCisJKCANCisJCXQgPSA8Q09OVEVOVD4gDQorCQkJew0KKwkJCQlpZiAoZmlyc3QpIHsNCisJCQkJCWZpcnN0ID0gZmFsc2U7DQorCQkJCX0gZWxzZSBpZiAod2hpdGVzcGFjZSkgew0KKwkJCQkJYnVmZmVyLmFwcGVuZCgiICIpOw0KKwkJCQkJd2hpdGVzcGFjZSA9IGZhbHNlOw0KKwkJCQl9DQorCQkJCWJ1ZmZlci5hcHBlbmQodC5pbWFnZSk7DQorCQkJfQ0KKwkJfCANCisJCXQgPSA8U1RSSU5HX0NPTlRFTlQ+DQorCQkJew0KKwkJCQlidWZmZXIuYXBwZW5kKHQuaW1hZ2UpOw0KKwkJCX0NCisJCXwNCisJCXQgPSA8UVVPVEVEU1RSSU5HPg0KKwkJCXsNCisJCQkJaWYgKGZpcnN0KSB7DQorCQkJCQlmaXJzdCA9IGZhbHNlOw0KKwkJCQl9IGVsc2UgaWYgKHdoaXRlc3BhY2UpIHsNCisJCQkJCWJ1ZmZlci5hcHBlbmQoIiAiKTsNCisJCQkJCXdoaXRlc3BhY2UgPSBmYWxzZTsNCisJCQkJfQ0KKwkJCQlidWZmZXIuYXBwZW5kKHQuaW1hZ2UpOw0KKwkJCX0NCisJCXwNCisJCXQgPSA8Rk9MRD4NCisJCQl7DQorCQkJCWlmIChwcmVzZXJ2ZUZvbGRpbmcpIGJ1ZmZlci5hcHBlbmQoIlxyXG4iKTsNCisJCQl9DQorCQl8DQorCQl0ID0gPFdTPiANCisJCQl7DQorCQkJCXdoaXRlc3BhY2UgPSB0cnVlOwkNCisJCQl9DQorCSkqDQorCXtyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7fQ0KK30NCisNCitUT0tFTl9NR1JfREVDTFMgOg0KK3sNCisJLy8gS2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgbGV2ZWxzIG9mIGNvbW1lbnQgbmVzdGluZw0KKwkvLyB3ZSd2ZSBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIDJuZA0KKwkvLyBsZXZlbCBpcyByZWFjaGVkLCBmb3IgZXhhbXBsZSAoKHRoaXMpKSwgbm90ICh0aGlzKS4NCisJLy8gVGhpcyBpcyBiZWNhdXNlIHRoZSBvdXRlcm1vc3QgbGV2ZWwgbXVzdCBiZSB0cmVhdGVkDQorCS8vIHNwZWNpYWxseSBhbnl3YXksIGJlY2F1c2UgdGhlIG91dGVybW9zdCAiKSIgaGFzIGENCisJLy8gZGlmZmVyZW50IHRva2VuIHR5cGUgdGhhbiBpbm5lciAiKSIgaW5zdGFuY2VzLg0KKwlpbnQgY29tbWVudE5lc3Q7DQorfQ0KKw0KKw0KK1NLSVAgOg0KK3sNCisJLy8gc3RhcnRzIGEgY29tbWVudA0KKwkiKCIgOiBJTkNPTU1FTlQNCit9DQorDQorPElOQ09NTUVOVD4gU0tJUCA6DQorew0KKwkvLyBlbmRzIGEgY29tbWVudA0KKwkiKSIgOiBERUZBVUxUDQorCS8vIGlmIHRoaXMgaXMgZXZlciBjaGFuZ2VkIHRvIG5vdCBiZSBhIFNLSVAsIG5lZWQNCisJLy8gdG8gbWFrZSBzdXJlIG1hdGNoZWRUb2tlbi50b2tlbiA9IHRva2VuLnRvU3RyaW5nKCkNCisJLy8gaXMgY2FsbGVkLg0KK30NCisNCis8SU5DT01NRU5UPiBTS0lQIDoNCit7DQorICAiKCIgeyBjb21tZW50TmVzdCA9IDE7IH0gOiBORVNURURfQ09NTUVOVA0KK30NCisNCis8SU5DT01NRU5UPiBTS0lQIDoNCit7DQorICA8flsgIigiLCAiKSIgXT4NCit9DQorDQorPE5FU1RFRF9DT01NRU5UPiBTS0lQOg0KK3sNCisJIigiIHsgKytjb21tZW50TmVzdDsgU3lzdGVtLm91dC5wcmludGxuKCIrKysgQ09NTUVOVCBORVNUPSIgKyBjb21tZW50TmVzdCk7fQ0KK3wJIikiIHsgLS1jb21tZW50TmVzdDsgU3lzdGVtLm91dC5wcmludGxuKCIrKysgQ09NTUVOVCBORVNUPSIgKyBjb21tZW50TmVzdCk7IGlmIChjb21tZW50TmVzdCA9PSAwKSBTd2l0Y2hUbyhJTkNPTU1FTlQpOyB9DQorfQ0KKw0KKzxORVNURURfQ09NTUVOVD4gU0tJUCA6DQorew0KKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQ0KK30NCisNCis8TkVTVEVEX0NPTU1FTlQ+IFNLSVA6DQorew0KKwk8flsgIigiLCAiKSIgXT4NCit9DQorDQorLy8gUVVPVEVEIFNUUklOR1MNCisNCitTS0lQIDoNCit7DQorCSJcIiIgOiBJTlFVT1RFRFNUUklORw0KK30NCisNCis8SU5RVU9URURTVFJJTkc+IE1PUkUgOg0KK3sNCisJPCA8UVVPVEVEUEFJUj4gPiB7IGltYWdlLmRlbGV0ZUNoYXJBdChpbWFnZS5sZW5ndGgoKSAtIDIpOyB9DQorfQ0KKw0KKzxJTlFVT1RFRFNUUklORz4gVE9LRU4gOg0KK3sNCisJPCBTVFJJTkdfQ09OVEVOVCA6ICh+WyJcIiIsICJcXCIsICJcciJdKSsgPg0KKwkvLyBQcmVzZXJ2ZSBsaW5lIGJyZWFrIHdpdGhpbiBxdW90ZXMgYnV0IG5vdCB0cmFpbGluZyB3aGl0ZSBzcGFjZQ0KK3wJPCBGT0xEOiAiXHJcbiIgKCBbIiAiLCAiXHQiXSApKiA+DQorfAk8IFFVT1RFRFNUUklORzogIlwiIiA+IHsgbWF0Y2hlZFRva2VuLmltYWdlID0gaW1hZ2Uuc3Vic3RyaW5nKDAsIGltYWdlLmxlbmd0aCgpIC0gMSk7IH0gOiBERUZBVUxUDQorfQ0KKw0KKzxERUZBVUxUPg0KK1RPS0VOIDoNCit7DQorIAk8IFdTOiAoIFsiICIsICJcdCIsICJcciIsICJcbiJdICkrID4NCit9DQorDQorPERFRkFVTFQ+DQorVE9LRU4gOg0KK3sNCisJPCBDT05URU5UOiAoflsiICIsICJcdCIsICJcciIsICJcbiIsICIoIiwgIlwiIl0pKyA+DQorfQ0KKw0KKzwqPg0KK1RPS0VOIDoNCit7DQorCTwgI1FVT1RFRFBBSVI6ICJcXCIgPEFOWT4gPg0KK3wJPCAjQU5ZOiAofltdKSsgPg0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhZG9jL292ZXJ2aWV3Lmh0bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qYXZhZG9jL292ZXJ2aWV3Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhMTdiYwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2phdmFkb2Mvb3ZlcnZpZXcuaHRtbApAQCAtMCwwICsxLDMyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICB1bmRlciB0aGUgTGljZW5zZS4gICAgCistLT4KKzxIVE1MPgorICA8SEVBRD4KKyAgICA8VElUTEU+QVBJIE92ZXJ2aWV3PC9USVRMRT4KKyAgPC9IRUFEPgorICA8Qk9EWT4KKzxwPjxiPk1pbWU0ajwvYj4gcHJvdmlkZXMgYSBwYXJzZXIsIDxhIGhyZWY9Im9yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lU3RyZWFtUGFyc2VyLmh0bWwiPk1pbWVTdHJlYW1QYXJzZXI8L2E+LCBmb3IgZS1tYWlsIG1lc3NhZ2Ugc3RyZWFtcyBpbiBwbGFpbiByZmM4MjIgYW5kIE1JTUUgZm9ybWF0IGFuZCBhIDxhIGhyZWY9Im9yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZS5odG1sIj5NZXNzYWdlPC9hPiBjbGFzcyB1c2VkIHRvIGJ1aWxkIGEgdHJlZSByZXByZXNlbnRhdGlvbiBvZiBhbiBlLW1haWwgbWVzc2FnZS48L3A+CisKKzxwPlRoZSBwYXJzZXIgdXNlcyBhIGNhbGxiYWNrIG1lY2hhbmlzbSB0byByZXBvcnQgcGFyc2luZyBldmVudHMgc3VjaCBhcyB0aGUgc3RhcnQgb2YgYW4gZW50aXR5IGhlYWRlciB0aGUgc3RhcnQgb2YgYSBib2R5LCBldGMuIElmIHlvdSBhcmUgZmFtaWxpYXIgd2l0aCB0aGUgU0FYIFhNTCBwYXJzZXIgaW50ZXJmYWNlIHlvdSBzaG91bGQgaGF2ZSBubyBwcm9ibGVtIGdldHRpbmcgc3RhcnRlZCB3aXRoIG1pbWU0ai48L3A+Cis8cD5UaGUgcGFyc2VyIG9ubHkgZGVhbHMgd2l0aCB0aGUgc3RydWN0dXJlIG9mIHRoZSBtZXNzYWdlIHN0cmVhbS4gSXQgd29uJ3QgZG8gYW55IGRlY29kaW5nIG9mIGJhc2U2NCBvciBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQgaGVhZGVyIGZpZWxkcyBhbmQgYm9kaWVzLiBUaGlzIGlzIGludGVudGlvbmFsIC0gdGhlIHBhcnNlciBzaG91bGQgb25seSBwcm92aWRlIHRoZSBtb3N0IGJhc2ljIGZ1bmN0aW9uYWxpdHkgbmVlZGVkIHRvIGJ1aWxkIG1vcmUgY29tcGxleCBwYXJzZXJzLiBIb3dldmVyLCBtaW1lNGogZG9lcyBpbmNsdWRlIGZhY2lsaXRpZXMgdG8gZGVjb2RlIGJvZGllcyBhbmQgZmllbGRzIGFuZCB0aGUgTWVzc2FnZSBjbGFzcyBkZXNjcmliZWQgYmVsb3cgaGFuZGxlcyBkZWNvZGluZyBvZiBmaWVsZHMgYW5kIGJvZGllcyB0cmFuc3BhcmVudGx5LjwvcD4KKzxwPlRoZSBwYXJzZXIgaGFzIGJlZW4gZGVzaWduZWQgdG8gYmUgZXh0cmVtZWx5IHRvbGVyYW50IGFnYWluc3QgbWVzc2FnZXMgdmlvbGF0aW5nIHRoZSBzdGFuZGFyZHMuIEl0IGhhcyBiZWVuIHRlc3RlZCB1c2luZyBhIGxhcmdlIGNvcnB1cyAoPjUwMDApIG9mIGUtbWFpbCBtZXNzYWdlcy4gQXMgYSBiZW5jaG1hcmsgdGhlIHdpZGVseSB1c2VkIHBlcmwgTUlNRTo6VG9vbHMgcGFyc2VyIGhhcyBiZWVuIHVzZWQuIG1pbWU0aiBhbmQgTUlNRTpUb29scyByYXJlbHkgZGlmZmVyICg8MjUgaW4gdGhvc2UgNTAwMCkuIFdoZW4gdGhleSBkbyAod2hpY2ggb25seSBvY2N1cnMgZm9yIGlsbGVnYWxseSBmb3JtYXR0ZWQgc3BhbSBtZXNzYWdlcykgd2UgdGhpbmsgbWltZTRqIGRvZXMgYSBiZXR0ZXIgam9iLjwvcD4KKzxwPjxiPk1pbWU0ajwvYj4gY2FuIGFsc28gYmUgdXNlZCB0byBidWlsZCBhIHRyZWUgcmVwcmVzZW50YXRpb24gb2YgYW4gZS1tYWlsIG1lc3NhZ2UgdXNpbmcgdGhlIDxhIGhyZWY9Im9yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZS5odG1sIj5NZXNzYWdlPC9hPiBjbGFzcy4gVXNpbmcgdGhpcyBmYWNpbGl0eSBtaW1lNGogYXV0b21hdGljYWxseSBoYW5kbGVzIHRoZSBkZWNvZGluZyBvZiBmaWVsZHMgYW5kIGJvZGllcyBhbmQgdXNlcyB0ZW1wb3JhcnkgZmlsZXMgZm9yIGxhcmdlIGF0dGFjaG1lbnRzLiBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIHJlcHJlc2VudGF0aW9uIGNvbnN0cnVjdGVkIGJ5IHRoZSBKYXZhTWFpbCBBUEk6cyBidXQgaXMgbW9yZSB0b2xlcmFudCB0byBtZXNzYWdlcyB2aW9sYXRpbmcgdGhlIHN0YW5kYXJkcy48L3A+CisgIDwvQk9EWT4KKzwvSFRNTD4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2pqdHJlZS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0FkZHJlc3NMaXN0UGFyc2VyLmpqdCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9tYWluL2pqdHJlZS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0FkZHJlc3NMaXN0UGFyc2VyLmpqdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWU1ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamp0cmVlL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvQWRkcmVzc0xpc3RQYXJzZXIuamp0CkBAIC0wLDAgKzEsMzU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorDQorLyoqDQorICogUkZDMjgyMiBhZGRyZXNzIGxpc3QgcGFyc2VyLg0KKyAqDQorICogQ3JlYXRlZCA5LzE3LzIwMDQNCisgKiBieSBKb2UgQ2hlbmcgPGNvZGVAam9lY2hlbmcuY29tPg0KKyAqLw0KKw0KK29wdGlvbnMgew0KKwlTVEFUSUM9ZmFsc2U7DQorCUxPT0tBSEVBRD0xOw0KKwlKREtfVkVSU0lPTiA9ICIxLjUiOw0KKwlWSVNJVE9SPXRydWU7DQorCU1VTFRJPXRydWU7DQorCU5PREVfU0NPUEVfSE9PSz10cnVlOw0KKwlOT0RFX0VYVEVORFM9Im9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLkJhc2VOb2RlIjsgDQorCS8vREVCVUdfUEFSU0VSPXRydWU7DQorCS8vREVCVUdfVE9LRU5fTUFOQUdFUj10cnVlOw0KK30NCisNCitQQVJTRVJfQkVHSU4oQWRkcmVzc0xpc3RQYXJzZXIpDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5wYXJzZXI7DQorDQorcHVibGljIGNsYXNzIEFkZHJlc3NMaXN0UGFyc2VyIHsNCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsNCisgICAgICAgIHdoaWxlICh0cnVlKSB7DQorICAgICAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICAgICAgQWRkcmVzc0xpc3RQYXJzZXIgcGFyc2VyID0gbmV3IEFkZHJlc3NMaXN0UGFyc2VyKFN5c3RlbS5pbik7DQorICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZUxpbmUoKTsNCisgICAgICAgICAgICAgICAgKChTaW1wbGVOb2RlKSBwYXJzZXIuamp0cmVlLnJvb3ROb2RlKCkpLmR1bXAoIj4gIik7DQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHgpIHsNCisgICAgICAgICAgICAgICAgeC5wcmludFN0YWNrVHJhY2UoKTsNCisgICAgICAgICAgICAgICAgcmV0dXJuOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgQVNUYWRkcmVzc19saXN0IHBhcnNlQWRkcmVzc0xpc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gew0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBwYXJzZUFkZHJlc3NMaXN0MCgpOw0KKyAgICAgICAgICAgIHJldHVybiAoQVNUYWRkcmVzc19saXN0KSBqanRyZWUucm9vdE5vZGUoKTsNCisgICAgICAgIH0gY2F0Y2ggKFRva2VuTWdyRXJyb3IgdG1lKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKHRtZS5nZXRNZXNzYWdlKCkpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyBBU1RhZGRyZXNzIHBhcnNlQWRkcmVzcygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIHBhcnNlQWRkcmVzczAoKTsNCisgICAgICAgICAgICByZXR1cm4gKEFTVGFkZHJlc3MpIGpqdHJlZS5yb290Tm9kZSgpOw0KKyAgICAgICAgfSBjYXRjaCAoVG9rZW5NZ3JFcnJvciB0bWUpIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24odG1lLmdldE1lc3NhZ2UoKSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIEFTVG1haWxib3ggcGFyc2VNYWlsYm94KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcGFyc2VNYWlsYm94MCgpOw0KKyAgICAgICAgICAgIHJldHVybiAoQVNUbWFpbGJveCkgamp0cmVlLnJvb3ROb2RlKCk7DQorICAgICAgICB9IGNhdGNoIChUb2tlbk1nckVycm9yIHRtZSkgew0KKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbih0bWUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICB2b2lkIGpqdHJlZU9wZW5Ob2RlU2NvcGUoTm9kZSBuKSB7DQorICAgICAgICAoKFNpbXBsZU5vZGUpIG4pLmZpcnN0VG9rZW4gPSBnZXRUb2tlbigxKTsNCisgICAgfQ0KKw0KKyAgICB2b2lkIGpqdHJlZUNsb3NlTm9kZVNjb3BlKE5vZGUgbikgew0KKyAgICAgICAgKChTaW1wbGVOb2RlKSBuKS5sYXN0VG9rZW4gPSBnZXRUb2tlbigwKTsNCisgICAgfQ0KK30NCisNCitQQVJTRVJfRU5EKEFkZHJlc3NMaXN0UGFyc2VyKQ0KKw0KK3ZvaWQgcGFyc2VMaW5lKCkgI3ZvaWQgOg0KK3t9DQorew0KKwlhZGRyZXNzX2xpc3QoKSBbIlxyIl0gIlxuIg0KK30NCisNCit2b2lkIHBhcnNlQWRkcmVzc0xpc3QwKCkgI3ZvaWQgOg0KK3t9DQorew0KKwlhZGRyZXNzX2xpc3QoKSA8RU9GPg0KK30NCisNCit2b2lkIHBhcnNlQWRkcmVzczAoKSAjdm9pZCA6DQore30NCit7DQorCWFkZHJlc3MoKSA8RU9GPg0KK30NCisNCit2b2lkIHBhcnNlTWFpbGJveDAoKSAjdm9pZCA6DQore30NCit7DQorCW1haWxib3goKSA8RU9GPg0KK30NCisNCit2b2lkIGFkZHJlc3NfbGlzdCgpIDoNCit7fQ0KK3sNCisJWyBhZGRyZXNzKCkgXQ0KKwkoDQorCQkiLCINCisJCVsgYWRkcmVzcygpIF0NCisJKSoNCit9DQorDQordm9pZCBhZGRyZXNzKCkgOg0KK3t9DQorew0KKwlMT09LQUhFQUQoMjE0NzQ4MzY0NykNCisJYWRkcl9zcGVjKCkNCit8CWFuZ2xlX2FkZHIoKQ0KK3wJKCBwaHJhc2UoKSAoZ3JvdXBfYm9keSgpIHwgYW5nbGVfYWRkcigpKSApDQorfQ0KKw0KK3ZvaWQgbWFpbGJveCgpIDoNCit7fQ0KK3sNCisJTE9PS0FIRUFEKDIxNDc0ODM2NDcpDQorCWFkZHJfc3BlYygpDQorfAlhbmdsZV9hZGRyKCkNCit8CW5hbWVfYWRkcigpDQorfQ0KKw0KK3ZvaWQgbmFtZV9hZGRyKCkgOg0KK3t9DQorew0KKwlwaHJhc2UoKSBhbmdsZV9hZGRyKCkNCit9DQorDQordm9pZCBncm91cF9ib2R5KCkgOg0KK3t9DQorew0KKwkiOiINCisJWyBtYWlsYm94KCkgXQ0KKwkoDQorCQkiLCINCisJCVsgbWFpbGJveCgpIF0NCisJKSoNCisJIjsiDQorfQ0KKw0KK3ZvaWQgYW5nbGVfYWRkcigpIDoNCit7fQ0KK3sNCisJIjwiIFsgcm91dGUoKSBdIGFkZHJfc3BlYygpICI+Ig0KK30NCisNCit2b2lkIHJvdXRlKCkgOg0KK3t9DQorew0KKwkiQCIgZG9tYWluKCkgKCAoIiwiKSogIkAiIGRvbWFpbigpICkqICI6Ig0KK30NCisNCit2b2lkIHBocmFzZSgpIDoNCit7fQ0KK3sNCisoCTxET1RBVE9NPg0KK3wJPFFVT1RFRFNUUklORz4NCispKw0KK30NCisNCit2b2lkIGFkZHJfc3BlYygpIDoNCit7fQ0KK3sNCisJKCBsb2NhbF9wYXJ0KCkgIkAiIGRvbWFpbigpICkNCit9DQorDQordm9pZCBsb2NhbF9wYXJ0KCkgOg0KK3sgVG9rZW4gdDsgfQ0KK3sNCisJKCB0PTxET1RBVE9NPiB8IHQ9PFFVT1RFRFNUUklORz4gKQ0KKwkoCVt0PSIuIl0NCisJCXsNCisJCQlpZiAoIHQua2luZCA9PSBBZGRyZXNzTGlzdFBhcnNlckNvbnN0YW50cy5RVU9URURTVFJJTkcgfHwgdC5pbWFnZS5jaGFyQXQodC5pbWFnZS5sZW5ndGgoKSAtIDEpICE9ICcuJykNCisJCQkJdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJXb3JkcyBpbiBsb2NhbCBwYXJ0IG11c3QgYmUgc2VwYXJhdGVkIGJ5ICcuJyIpOw0KKwkJfQ0KKwkJKAl0PTxET1RBVE9NPiB8IHQ9PFFVT1RFRFNUUklORz4gKQ0KKwkpKg0KK30NCisNCit2b2lkIGRvbWFpbigpIDoNCit7IFRva2VuIHQ7IH0NCit7DQorCSgJdD08RE9UQVRPTT4NCisJCSgJW3Q9Ii4iXQ0KKwkJCXsNCisJCQkJaWYgKHQuaW1hZ2UuY2hhckF0KHQuaW1hZ2UubGVuZ3RoKCkgLSAxKSAhPSAnLicpDQorCQkJCQl0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkF0b21zIGluIGRvbWFpbiBuYW1lcyBtdXN0IGJlIHNlcGFyYXRlZCBieSAnLiciKTsNCisJCQl9DQorCQkJdD08RE9UQVRPTT4NCisJCSkqDQorCSkNCit8CTxET01BSU5MSVRFUkFMPg0KK30NCisNCitTUEVDSUFMX1RPS0VOIDoNCit7DQorIAk8IFdTOiAoIFsiICIsICJcdCJdICkrID4NCit9DQorDQorVE9LRU4gOg0KK3sNCisJPCAjQUxQSEE6IFsiYSIgLSAieiIsICJBIiAtICJaIl0gPg0KK3wJPCAjRElHSVQ6IFsiMCIgLSAiOSJdID4NCit8CTwgI0FURVhUOiAoIDxBTFBIQT4gfCA8RElHSVQ+DQorCQkJICB8ICIhIiB8ICIjIiB8ICIkIiB8ICIlIg0KKwkJCSAgfCAiJiIgfCAiJyIgfCAiKiIgfCAiKyINCisJCQkgIHwgIi0iIHwgIi8iIHwgIj0iIHwgIj8iDQorCQkJICB8ICJeIiB8ICJfIiB8ICJgIiB8ICJ7Ig0KKwkJCSAgfCAifCIgfCAifSIgfCAifiINCisJCQkgICk+DQorfAk8IERPVEFUT006IDxBVEVYVD4gKCA8QVRFWFQ+IHwgIi4iICkqID4NCit9DQorDQorVE9LRU5fTUdSX0RFQ0xTIDoNCit7DQorCS8vIEtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IGxldmVscyBvZiBjb21tZW50IG5lc3RpbmcNCisJLy8gd2UndmUgZW5jb3VudGVyZWQuICBUaGlzIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSAybmQNCisJLy8gbGV2ZWwgaXMgcmVhY2hlZCwgZm9yIGV4YW1wbGUgKCh0aGlzKSksIG5vdCAodGhpcykuDQorCS8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgb3V0ZXJtb3N0IGxldmVsIG11c3QgYmUgdHJlYXRlZA0KKwkvLyBzcGVjaWFsbHkgYW55d2F5LCBiZWNhdXNlIHRoZSBvdXRlcm1vc3QgIikiIGhhcyBhIA0KKwkvLyBkaWZmZXJlbnQgdG9rZW4gdHlwZSB0aGFuIGlubmVyICIpIiBpbnN0YW5jZXMuDQorCXN0YXRpYyBpbnQgY29tbWVudE5lc3Q7DQorfQ0KKw0KK01PUkUgOg0KK3sNCisJLy8gZG9tYWluIGxpdGVyYWwNCisJIlsiIDogSU5ET01BSU5MSVRFUkFMDQorfQ0KKw0KKzxJTkRPTUFJTkxJVEVSQUw+DQorTU9SRSA6DQorew0KKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQ0KK3wJPCB+WyJbIiwgIl0iLCAiXFwiXSA+DQorfQ0KKw0KKzxJTkRPTUFJTkxJVEVSQUw+DQorVE9LRU4gOg0KK3sNCisJPCBET01BSU5MSVRFUkFMOiAiXSIgPiB7IG1hdGNoZWRUb2tlbi5pbWFnZSA9IGltYWdlLnRvU3RyaW5nKCk7IH06IERFRkFVTFQNCit9DQorDQorTU9SRSA6DQorew0KKwkvLyBzdGFydHMgYSBjb21tZW50DQorCSIoIiA6IElOQ09NTUVOVA0KK30NCisNCis8SU5DT01NRU5UPg0KK1NLSVAgOg0KK3sNCisJLy8gZW5kcyBhIGNvbW1lbnQNCisJPCBDT01NRU5UOiAiKSIgPiA6IERFRkFVTFQNCisJLy8gaWYgdGhpcyBpcyBldmVyIGNoYW5nZWQgdG8gbm90IGJlIGEgU0tJUCwgbmVlZA0KKwkvLyB0byBtYWtlIHN1cmUgbWF0Y2hlZFRva2VuLnRva2VuID0gdG9rZW4udG9TdHJpbmcoKQ0KKwkvLyBpcyBjYWxsZWQuDQorfQ0KKw0KKzxJTkNPTU1FTlQ+DQorTU9SRSA6DQorew0KKwk8IDxRVU9URURQQUlSPj4geyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAyKTsgfQ0KK3wJIigiIHsgY29tbWVudE5lc3QgPSAxOyB9IDogTkVTVEVEX0NPTU1FTlQNCit8CTwgPEFOWT4+DQorfQ0KKw0KKzxORVNURURfQ09NTUVOVD4NCitNT1JFIDoNCit7DQorCTwgPFFVT1RFRFBBSVI+PiB7IGltYWdlLmRlbGV0ZUNoYXJBdChpbWFnZS5sZW5ndGgoKSAtIDIpOyB9DQorfAkiKCIgeyArK2NvbW1lbnROZXN0OyB9DQorfAkiKSIgeyAtLWNvbW1lbnROZXN0OyBpZiAoY29tbWVudE5lc3QgPT0gMCkgU3dpdGNoVG8oSU5DT01NRU5UKTsgfQ0KK3wJPCA8QU5ZPj4NCit9DQorDQorDQorLy8gUVVPVEVEIFNUUklOR1MNCisNCitNT1JFIDoNCit7DQorCSJcIiIgeyBpbWFnZS5kZWxldGVDaGFyQXQoaW1hZ2UubGVuZ3RoKCkgLSAxKTsgfSA6IElOUVVPVEVEU1RSSU5HDQorfQ0KKw0KKzxJTlFVT1RFRFNUUklORz4NCitNT1JFIDoNCit7DQorCTwgPFFVT1RFRFBBSVI+PiB7IGltYWdlLmRlbGV0ZUNoYXJBdChpbWFnZS5sZW5ndGgoKSAtIDIpOyB9DQorfAk8ICh+WyJcIiIsICJcXCJdKSsgPg0KK30NCisNCis8SU5RVU9URURTVFJJTkc+DQorVE9LRU4gOg0KK3sNCisJPCBRVU9URURTVFJJTkc6ICJcIiIgPiB7IG1hdGNoZWRUb2tlbi5pbWFnZSA9IGltYWdlLnN1YnN0cmluZygwLCBpbWFnZS5sZW5ndGgoKSAtIDEpOyB9IDogREVGQVVMVA0KK30NCisNCisvLyBHTE9CQUxTDQorDQorPCo+DQorVE9LRU4gOg0KK3sNCisJPCAjUVVPVEVEUEFJUjogIlxcIiA8QU5ZPiA+DQorfAk8ICNBTlk6IH5bXSA+DQorfQ0KKw0KKy8vIEVSUk9SIQ0KKy8qDQorDQorPCo+DQorVE9LRU4gOg0KK3sNCisJPCBVTkVYUEVDVEVEX0NIQVI6IDxBTlk+ID4NCit9DQorDQorKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvbWFpbi9qanRyZWUvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvYWRkcmVzcy9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamp0cmVlL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvUGFyc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ2ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL21haW4vamp0cmVlL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gMy4wICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyOworCisvKioKKyAqIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHBhcnNlIGVycm9ycyBhcmUgZW5jb3VudGVyZWQuCisgKiBZb3UgY2FuIGV4cGxpY2l0bHkgY3JlYXRlIG9iamVjdHMgb2YgdGhpcyBleGNlcHRpb24gdHlwZSBieQorICogY2FsbGluZyB0aGUgbWV0aG9kIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24gaW4gdGhlIGdlbmVyYXRlZAorICogcGFyc2VyLgorICoKKyAqIENoYW5nZXMgZm9yIE1pbWU0SjoKKyAqICAgZXh0ZW5kcyBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5QYXJzZUV4Y2VwdGlvbgorICogICBhZGRlZCBzZXJpYWxWZXJzaW9uVUlECisgKiAgIGFkZGVkIGNvbnN0cnVjdG9yIFBhcnNlRXhjZXB0aW9uKFRocm93YWJsZSkKKyAqICAgZGVmYXVsdCBkZXRhaWwgbWVzc2FnZSBpcyAiQ2Fubm90IHBhcnNlIGZpZWxkIgorICovCitwdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5QYXJzZUV4Y2VwdGlvbiB7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgLyoqCisgICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgbWV0aG9kICJnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIgorICAgKiBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNlci4gIENhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvciBnZW5lcmF0ZXMKKyAgICogYSBuZXcgb2JqZWN0IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBmaWVsZHMgImN1cnJlbnRUb2tlbiIsCisgICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBzZXQuICBUaGUgYm9vbGVhbgorICAgKiBmbGFnICJzcGVjaWFsQ29uc3RydWN0b3IiIGlzIGFsc28gc2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdAorICAgKiB0aGlzIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIG9iamVjdC4KKyAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBpdHMgc3VwZXIgY2xhc3Mgd2l0aCB0aGUgZW1wdHkgc3RyaW5nCisgICAqIHRvIGZvcmNlIHRoZSAidG9TdHJpbmciIG1ldGhvZCBvZiBwYXJlbnQgY2xhc3MgIlRocm93YWJsZSIgdG8KKyAgICogcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGZvcm06CisgICAqICAgICBQYXJzZUV4Y2VwdGlvbjogPHJlc3VsdCBvZiBnZXRNZXNzYWdlPgorICAgKi8KKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRva2VuIGN1cnJlbnRUb2tlblZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIHRva2VuSW1hZ2VWYWwKKyAgICAgICAgICAgICAgICAgICAgICAgKQorICB7CisgICAgc3VwZXIoIiIpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IHRydWU7CisgICAgY3VycmVudFRva2VuID0gY3VycmVudFRva2VuVmFsOworICAgIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsOworICAgIHRva2VuSW1hZ2UgPSB0b2tlbkltYWdlVmFsOworICB9CisKKyAgLyoqCisgICAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBmb3IgdXNlIGJ5IHlvdSBmb3Igd2hhdGV2ZXIKKyAgICogcHVycG9zZSB5b3UgY2FuIHRoaW5rIG9mLiAgQ29uc3RydWN0aW5nIHRoZSBleGNlcHRpb24gaW4gdGhpcworICAgKiBtYW5uZXIgbWFrZXMgdGhlIGV4Y2VwdGlvbiBiZWhhdmUgaW4gdGhlIG5vcm1hbCB3YXkgLSBpLmUuLCBhcworICAgKiBkb2N1bWVudGVkIGluIHRoZSBjbGFzcyAiVGhyb3dhYmxlIi4gIFRoZSBmaWVsZHMgImVycm9yVG9rZW4iLAorICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgZG8gbm90IGNvbnRhaW4KKyAgICogcmVsZXZhbnQgaW5mb3JtYXRpb24uICBUaGUgSmF2YUNDIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHVzZQorICAgKiB0aGVzZSBjb25zdHJ1Y3RvcnMuCisgICAqLworCisgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbigpIHsKKyAgICBzdXBlcigiQ2Fubm90IHBhcnNlIGZpZWxkIik7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgc3VwZXIoY2F1c2UpOworICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOworICB9CisKKyAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgc3VwZXIobWVzc2FnZSk7CisgICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7CisgIH0KKworICAvKioKKyAgICogVGhpcyB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoaWNoIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZQorICAgKiB0aGlzIG9iamVjdCBhbmQgdGhlcmVieSBhZmZlY3RzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlCisgICAqICJnZXRNZXNzYWdlIiBtZXRob2QgKHNlZSBiZWxvdykuCisgICAqLworICBwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWFsQ29uc3RydWN0b3I7CisKKyAgLyoqCisgICAqIFRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gdGhhdCBoYXMgYmVlbiBjb25zdW1lZCBzdWNjZXNzZnVsbHkuICBJZgorICAgKiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkIGR1ZSB0byBhIHBhcnNlIGVycm9yLCB0aGUgdG9rZW4KKyAgICogZm9sbG93bmcgdGhpcyB0b2tlbiB3aWxsICh0aGVyZWZvcmUpIGJlIHRoZSBmaXJzdCBlcnJvciB0b2tlbi4KKyAgICovCisgIHB1YmxpYyBUb2tlbiBjdXJyZW50VG9rZW47CisKKyAgLyoqCisgICAqIEVhY2ggZW50cnkgaW4gdGhpcyBhcnJheSBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEVhY2ggYXJyYXkKKyAgICogb2YgaW50ZWdlcnMgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHRva2VucyAoYnkgdGhlaXIgb3JkaW5hbAorICAgKiB2YWx1ZXMpIHRoYXQgaXMgZXhwZWN0ZWQgYXQgdGhpcyBwb2ludCBvZiB0aGUgcGFyc2UuCisgICAqLworICBwdWJsaWMgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzOworCisgIC8qKgorICAgKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAidG9rZW5JbWFnZSIgYXJyYXkgb2YgdGhlIGdlbmVyYXRlZAorICAgKiBwYXJzZXIgd2l0aGluIHdoaWNoIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZC4gIFRoaXMgYXJyYXkgaXMKKyAgICogZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIC4uLkNvbnN0YW50cyBpbnRlcmZhY2UuCisgICAqLworICBwdWJsaWMgU3RyaW5nW10gdG9rZW5JbWFnZTsKKworICAvKioKKyAgICogVGhpcyBtZXRob2QgaGFzIHRoZSBzdGFuZGFyZCBiZWhhdmlvciB3aGVuIHRoaXMgb2JqZWN0IGhhcyBiZWVuCisgICAqIGNyZWF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGNvbnN0cnVjdG9ycy4gIE90aGVyd2lzZSwgaXQgdXNlcworICAgKiAiY3VycmVudFRva2VuIiBhbmQgImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiIHRvIGdlbmVyYXRlIGEgcGFyc2UKKyAgICogZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyBpdC4gIElmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQKKyAgICogZHVlIHRvIGEgcGFyc2UgZXJyb3IsIGFuZCB5b3UgZG8gbm90IGNhdGNoIGl0IChpdCBnZXRzIHRocm93bgorICAgKiBmcm9tIHRoZSBwYXJzZXIpLCB0aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHByaW50aW5nCisgICAqIG9mIHRoZSBmaW5hbCBzdGFjayB0cmFjZSwgYW5kIGhlbmNlIHRoZSBjb3JyZWN0IGVycm9yIG1lc3NhZ2UKKyAgICogZ2V0cyBkaXNwbGF5ZWQuCisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgaWYgKCFzcGVjaWFsQ29uc3RydWN0b3IpIHsKKyAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7CisgICAgfQorICAgIFN0cmluZ0J1ZmZlciBleHBlY3RlZCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICBpbnQgbWF4U2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAobWF4U2l6ZSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKSB7CisgICAgICAgIG1heFNpemUgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykgeworICAgICAgICBleHBlY3RlZC5hcHBlbmQodG9rZW5JbWFnZVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSkuYXBwZW5kKCIgIik7CisgICAgICB9CisgICAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCAtIDFdICE9IDApIHsKKyAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKCIuLi4iKTsKKyAgICAgIH0KKyAgICAgIGV4cGVjdGVkLmFwcGVuZChlb2wpLmFwcGVuZCgiICAgICIpOworICAgIH0KKyAgICBTdHJpbmcgcmV0dmFsID0gIkVuY291bnRlcmVkIFwiIjsKKyAgICBUb2tlbiB0b2sgPSBjdXJyZW50VG9rZW4ubmV4dDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFNpemU7IGkrKykgeworICAgICAgaWYgKGkgIT0gMCkgcmV0dmFsICs9ICIgIjsKKyAgICAgIGlmICh0b2sua2luZCA9PSAwKSB7CisgICAgICAgIHJldHZhbCArPSB0b2tlbkltYWdlWzBdOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJldHZhbCArPSBhZGRfZXNjYXBlcyh0b2suaW1hZ2UpOworICAgICAgdG9rID0gdG9rLm5leHQ7IAorICAgIH0KKyAgICByZXR2YWwgKz0gIlwiIGF0IGxpbmUgIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luTGluZSArICIsIGNvbHVtbiAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5Db2x1bW47CisgICAgcmV0dmFsICs9ICIuIiArIGVvbDsKKyAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGggPT0gMSkgeworICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nOiIgKyBlb2wgKyAiICAgICI7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZyBvbmUgb2Y6IiArIGVvbCArICIgICAgIjsKKyAgICB9CisgICAgcmV0dmFsICs9IGV4cGVjdGVkLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIHJldHZhbDsKKyAgfQorCisgIC8qKgorICAgKiBUaGUgZW5kIG9mIGxpbmUgc3RyaW5nIGZvciB0aGlzIG1hY2hpbmUuCisgICAqLworICBwcm90ZWN0ZWQgU3RyaW5nIGVvbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsKKyAKKyAgLyoqCisgICAqIFVzZWQgdG8gY29udmVydCByYXcgY2hhcmFjdGVycyB0byB0aGVpciBlc2NhcGVkIHZlcnNpb24KKyAgICogd2hlbiB0aGVzZSByYXcgdmVyc2lvbiBjYW5ub3QgYmUgdXNlZCBhcyBwYXJ0IG9mIGFuIEFTQ0lJCisgICAqIHN0cmluZyBsaXRlcmFsLgorICAgKi8KKyAgcHJvdGVjdGVkIFN0cmluZyBhZGRfZXNjYXBlcyhTdHJpbmcgc3RyKSB7CisgICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgY2hhciBjaDsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQorICAgICAgICB7CisgICAgICAgICAgIGNhc2UgMCA6CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcYic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHQnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1xuJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcZic6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgY2FzZSAnXCcnOgorICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICBjYXNlICdcXCc6CisgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7CisgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOworICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKKyAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3NpdGUvYXB0L3N0YXR1cy5hcHQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS9hcHQvc3RhdHVzLmFwdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzZkMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3NpdGUvYXB0L3N0YXR1cy5hcHQKQEAgLTAsMCArMSwzOSBAQAorCit+fiAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK35+ICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCit+fiAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCit+fiAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK35+ICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorfn4gICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit+fiAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKK35+Cit+fiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCit+fgorfn4gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCit+fiAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCit+fiAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorfn4gICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK35+ICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworfn4gICB1bmRlciB0aGUgTGljZW5zZS4KKworIC0tLS0tLS0tLS0tLS0KKyBTdGF0dXMKKyAtLS0tLS0tLS0tLS0tCisKK3tTdGF0dXN9CisKKyAgICBUaGUgMC40IHJlbGVhc2UgYnJvdWdodCBhIG51bWJlciBvZiBzaWduaWZpY2FudCBpbXByb3ZlbWVudHMgaW4gdGVybXMgb2YgCisgICAgc3VwcG9ydGVkIGNhcGFiaWxpdGllcywgZmxleGliaWxpdHkgYW5kIHBlcmZvcm1hbmNlLgorCisgICAgVGhlIDAuNSByZWxlYXNlIGFkZHJlc3NlZCBhIG51bWJlciBvZiBpbXBvcnRhbnQgaXNzdWVzIGRpc2NvdmVyZWQgc2luY2UKKyAgICB0aGUgMC40IHJlbGVhc2UuIEluIHBhcnRpY3VsYXIgaXQgaW1wcm92ZWQgTWltZTRqIGFiaWxpdHkgdG8gZGVhbCB3aXRoCisgICAgbWFsZm9ybWVkIGRhdGEgc3RyZWFtcyBpbmNsdWRpbmcgdGhvc2UgaW50ZW50aW9uYWxseSBjcmFmdGVkIHRvIGNhdXNlIAorICAgIGV4Y2Vzc2l2ZSBDUFUgYW5kIG1lbW9yeSB1dGlsaXphdGlvbiB0aGF0IGNhbiBsZWFkIHRvIERvUyBjb25kaXRpb25zLgorCisgICAgVGhlIDAuNiByZWxlYXNlIGJyb3VnaHQgYW5vdGhlciByb3VuZCBvZiBBUEkgZW5oYW5jZW1lbnRzIGFuZCBwZXJmb3JtYW5jZSAKKyAgICBvcHRpbWl6YXRpb25zLiBBcyBvZiB0aGlzIHJlbGVhc2UgTWltZTRqIHJlcXVpcmVzIGEgSmF2YSAxLjUgY29tcGF0aWJsZSAKKyAgICBydW50aW1lLiAgICAKKyAgICAKKyAgICBUaGUgbmV4dCByZWxlYXNlIHdpbGwgYmUgdmVyc2lvbiAwLjcuIFRoZSBtYWluIGZvY3VzIG9mIHRoZSBkZXZlbG9wbWVudCAKKyAgICBlZmZvcnRzIHdpbGwgYmUgb24gb3B0aW1pemF0aW9uIG9mIE1JTUUgaGVhZGVyIHBhcnNpbmcgYW5kIGZ1cnRoZXIgCisgICAgZW5oYW5jZW1lbnQgb2YgRE9NIGNhcGFiaWxpdGllcy4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL2FwdC91c2FnZS5hcHQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MWNlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0CkBAIC0wLDAgKzEsMTkxIEBACisNCit+fiAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCit+fiAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KK35+ICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCit+fiAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCit+fiAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCit+fiAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCit+fiAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCit+fg0KK35+ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCit+fg0KK35+ICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KK35+ICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCit+fiAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KK35+ICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorfn4gICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorfn4gICB1bmRlciB0aGUgTGljZW5zZS4NCisNCisgLS0tLS0tLS0tLS0tLQ0KKyBVc2FnZQ0KKyAtLS0tLS0tLS0tLS0tDQorDQore1VzYWdlfQ0KKw0KKyAgTWltZTRqIHByb3ZpZGVzIHR3byBkaWZmZXJlbnQgQVBJJ3M6IEFuIGV2ZW50IGJhc2VkIEFQSSBieSB1c2luZw0KKyAgdGhlIHt7e2FwaWRvY3Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVTdHJlYW1QYXJzZXIuaHRtbH0NCisgIE1pbWVTdHJlYW1QYXJzZXJ9fS4gQWx0ZXJuYXRpdmVseSwgeW91IG1heSB1c2UgdGhlIGl0ZXJhdGl2ZQ0KKyAgQVBJLCB3aGljaCBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUNCisgIHt7e2FwaWRvY3Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVUb2tlblN0cmVhbS5odG1sfQ0KKyAgTWltZVRva2VuU3RyZWFtfX0uIEluIHRlcm1zIG9mIHNwZWVkLCB5b3Ugc2hvdWxkIG5vdCBub3RlDQorICBhbnkgZGlmZmVyZW5jZXMuDQorDQorICAqIHt7eyNUb2tlbiBTdHJlYW1zfVRva2VuIFN0cmVhbXN9fQ0KKw0KKyAgKiB7e3sjU2FtcGxlIFRva2VuIFN0cmVhbX1TYW1wbGUgVG9rZW4gU3RyZWFtfX0NCisNCisgICoge3t7I0V2ZW50IEhhbmRsZXJzfUV2ZW50IEhhbmRsZXJzfX0NCisNCisgICoge3t7I1NhbXBsZSBFdmVudCBTdHJlYW19U2FtcGxlIEV2ZW50IFN0cmVhbX19DQorDQore1Rva2VuIFN0cmVhbXN9DQorDQorICBUaGUgaXRlcmF0aXZlIGFwcHJvYWNoIGlzIHVzaW5nIHRoZSBjbGFzcw0KKyAge3t7YXBpZG9jcy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVRva2VuU3RyZWFtLmh0bWx9DQorICBNaW1lVG9rZW5TdHJlYW19fS4gSGVyZSdzIGFuIGV4YW1wbGUsIGhvdyB5b3UgY291bGQgdXNlDQorICB0aGUgdG9rZW4gc3RyZWFtOg0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICBNaW1lVG9rZW5TdHJlYW0gc3RyZWFtID0gbmV3IE1pbWVUb2tlblN0cmVhbSgpOw0KKyAgc3RyZWFtLnBhcnNlKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oIm1pbWUubXNnIikpKTsNCisgIGZvciAoaW50IHN0YXRlID0gc3RyZWFtLmdldFN0YXRlKCk7DQorICAgICAgIHN0YXRlICE9IE1pbWVUb2tlblN0cmVhbS5UX0VORF9PRl9TVFJFQU07DQorICAgICAgIHN0YXRlID0gc3RyZWFtLm5leHQoKSkgew0KKyAgICBzd2l0Y2ggKHN0YXRlKSB7DQorICAgICAgY2FzZSBNaW1lVG9rZW5TdHJlYW0uVF9CT0RZOg0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCb2R5IGRldGVjdGVkLCBjb250ZW50cyA9ICINCisgICAgICAgICAgKyBzdHJlYW0uZ2V0SW5wdXRTdHJlYW0oKSArICIsIGhlYWRlciBkYXRhID0gIg0KKyAgICAgICAgICArIHN0cmVhbS5nZXRCb2R5RGVzY3JpcHRvcigpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTWltZVRva2VuU3RyZWFtLlRfRklFTEQ6DQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlYWRlciBmaWVsZCBkZXRlY3RlZDogIg0KKyAgICAgICAgICArIHN0cmVhbS5nZXRGaWVsZCgpKTsNCisgICAgICAgIGJyZWFrOw0KKyAgICAgIGNhc2UgTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTVVMVElQQVJUOg0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBhcnQgbWVzc2FnZSBkZXRleHRlZCwiDQorICAgICAgICAgICsgIiBoZWFkZXIgZGF0YSA9ICINCisgICAgICAgICAgKyBzdHJlYW0uZ2V0Qm9keURlc2NyaXB0b3IoKSk7DQorICAgICAgLi4uDQorICAgIH0NCisgIH0NCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgDQorDQorICBUaGUgdG9rZW4gc3RyZWFtIHByb3ZpZGVzIGEgc2V0IG9mIHRva2Vucy4gVG9rZW5zIGFyZSBpZGVudGlmaWVkDQorICBieSBhIHN0YXRlLiBNb3N0IHN0YXRlcyBhcmUgc2ltcGx5IGV2ZW50IGluZGljYXRvcnMsIHdpdGggbm8NCisgIGFkZGl0aW9uYWwgZGF0YSBhdmFpbGFibGUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lIHN0YXRlcywNCisgIHdoaWNoIHByb3ZpZGUgYWRkaXRpb25hbCBkYXRhLiBGb3IgZXhhbXBsZSwgdGhlIHN0YXRlDQorICA8PDxUX0JPRFk+Pj4sIHdoaWNoIGluZGljYXRlcyB0aGF0IGFuIGFjdHVhbCBib2R5IGlzIGF2YWlsYWJsZSwNCisgIElmIHlvdSBub3RlIHRoaXMgc3RhdGUsIHRoZW4geW91IG1heSBhc2sgZm9yIHRoZSBib2RpZXMgY29udGVudHMsDQorICB3aGljaCBhcmUgcHJvdmlkZWQgdGhyb3VnaCB0aGUgPDw8Z2V0SW5wdXRTdHJlYW0oKT4+PiBtZXRob2QsDQorICBvciB5b3UgbWlnaHQgYXNrIGZvciB0aGUgaGVhZGVyIGRhdGEgYnkgaW52b2tpbmcNCisgIDw8PGdldEJvZHlEZXNjcmlwdG9yKCk+Pj4uDQorDQore1NhbXBsZSBUb2tlbiBTdHJlYW19DQorDQorICBUaGUgZm9sbG93aW5nIHNhbXBsZSBzaG91bGQgZ2l2ZSB5b3UgYSByb3VnaCBpZGVhIG9mIHRoZSBvcmRlciwNCisgIGluIHdoaWNoIHlvdSdsbCByZWNlaXZlIHRva2VuczoNCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgDQorICBUX1NUQVJUX01FU1NBR0UNCisgICAgICBUX1NUQVJUX0hFQURFUg0KKyAgICAgICAgICBUX0ZJRUxEDQorICAgICAgICAgIFRfRklFTEQNCisgICAgICAgICAgLi4uDQorICAgICAgVF9FTkRfSEVBREVSDQorICAgICAgVF9TVEFSVF9NVUxUSVBBUlQNCisgICAgICAgICAgVF9QUkVBTUJMRQ0KKyAgICAgICAgICBUX1NUQVJUX0JPRFlQQVJUDQorICAgICAgICAgICAgICBUX1NUQVJUX0hFQURFUg0KKyAgICAgICAgICAgICAgICAgIFRfRklFTEQNCisgICAgICAgICAgICAgICAgICBUX0ZJRUxEDQorICAgICAgICAgICAgICAgICAgLi4uDQorICAgICAgICAgICAgICBUX0VORF9IRUFERVINCisgICAgICAgICAgICAgIFRfQk9EWQ0KKyAgICAgICAgICBUX0VORF9CT0RZUEFSVA0KKyAgICAgICAgICBUX1NUQVJUX0JPRFlQQVJUDQorICAgICAgICAgICAgICBUX1NUQVJUX0hFQURFUg0KKyAgICAgICAgICAgICAgICAgIFRfRklFTEQNCisgICAgICAgICAgICAgICAgICBUX0ZJRUxEDQorICAgICAgICAgICAgICAgICAgLi4uDQorICAgICAgICAgICAgICBUX0VORF9IRUFERVINCisgICAgICAgICAgICAgIFRfQk9EWQ0KKyAgICAgICAgICBUX0VORF9CT0RZUEFSVA0KKyAgICAgICAgICBUX0VQSUxPR1VFDQorICAgICAgVF9FTkRfTVVMVElQQVJUDQorICAgVF9FTkRfTUVTU0FHRQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICANCisNCisgIFRoZSBleGFtcGxlIHNob3dzIGEgbXVsdGlwYXJ0IG1lc3NhZ2Ugd2l0aCB0d28gcGFydHMuDQorDQore0V2ZW50IEhhbmRsZXJzfQ0KKw0KKyAgVGhlIGV2ZW50IGJhc2VkIEFQSSByZXF1aXJlcywgdGhhdCB5b3UgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyLA0KKyAgd2hpY2ggcmVjZWl2ZXMgZXZlbnRzLiBUaGUgZXZlbnQgaGFuZGxlciBpcyBhbiBvYmplY3QsIHdoaWNoDQorICBpbXBsZW1lbnRzIHRoZSB7e3thcGlkb2NzL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9Db250ZW50SGFuZGxlci5odG1sfQ0KKyAgQ29udGVudEhhbmRsZXJ9fSBpbnRlcmZhY2UuIEhlcmUncyBhbiBleGFtcGxlLCBob3cgeW91IGNvdWxkDQorICBpbXBsZW1lbnQgYW4gZXZlbnQgaGFuZGxlcjoNCisNCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgDQorICBwdWJsaWMgY2xhc3MgTXlDb250ZW50SGFuZGxlciBleHRlbmRzIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5Db250ZW50SGFuZGxlciB7DQorICAgICAgcHVibGljIGJvZHkoQm9keURlc2NyaXB0b3IgYmQsIElucHV0U3RyZWFtIGlzKQ0KKyAgICAgICAgICAgICAgdGhyb3dzIE1pbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCb2R5IGRldGVjdGVkLCBjb250ZW50cyA9ICINCisgICAgICAgICAgICAgICsgaXMgKyAiLCBoZWFkZXIgZGF0YSA9ICIgKyBiZCk7DQorICAgICAgfQ0KKyAgICAgIHB1YmxpYyB2b2lkIGZpZWxkKFN0cmluZyBmaWVsZERhdGEpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsNCisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWFkZXIgZmllbGQgZGV0ZWN0ZWQ6ICINCisgICAgICAgICAgICAgICsgZmllbGREYXRhKTsNCisgICAgICB9DQorICAgICAgcHVibGljIHZvaWQgc3RhcnRNdWx0aXBhcnQoQm9keURlc2NyaXB0b3IgYmQpIHRocm93cyBNaW1lRXhjZXB0aW9uIHsNCisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJNdWx0aXBhcnQgbWVzc2FnZSBkZXRleHRlZCwgaGVhZGVyIGRhdGEgPSAiDQorICAgICAgICAgICAgICArIGJkKTsNCisgICAgICB9DQorICAgICAgLi4uDQorICB9DQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIA0KKw0KKyAgQSBsaXR0bGUgYml0IG9mIGFkZGl0aW9uYWwgY29kZSBhbGxvd3MgdXMgdG8gY3JlYXRlIGFuIGV4YW1wbGUsIHdoaWNoDQorICBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byB0aGUgZXhhbXBsZSBmcm9tIHRoZSBzZWN0aW9uIG9uDQorICB7e3sjVG9rZW4gU3RyZWFtc31Ub2tlbiBTdHJlYW1zfX06DQorDQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIA0KKyAgQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBNeUNvbnRlbnRIYW5kbGVyKCk7DQorICBNaW1lU3RyZWFtUGFyc2VyIHBhcnNlciA9IG5ldyBNaW1lU3RyZWFtUGFyc2VyKCk7DQorICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcik7DQorICBwYXJzZXIucGFyc2UobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSgibWltZS5tc2ciKSkpOw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICANCisNCit7U2FtcGxlIEV2ZW50IFN0cmVhbX0NCisNCisgIExpa2UgYWJvdmUgZm9yIHRva2Vucywgd2UgcHJvdmlkZSBhbiBhZGRpdGlvbmFsIGV4YW1wbGUsIHdoaWNoDQorICBkZW1vbnN0cmF0ZXMgdGhlIHR5cGljYWwgb3JkZXIgb2YgZXZlbnRzIHRoYXQgeW91IGhhdmUgdG8gZXhwZWN0Og0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorICBzdGFydE1lc3NhZ2UoKQ0KKyAgICAgIHN0YXJ0SGVhZGVyKCkNCisgICAgICAgICAgZmllbGQoLi4uKQ0KKyAgICAgICAgICBmaWVsZCguLi4pDQorICAgICAgICAgIC4uLg0KKyAgICAgIGVuZEhlYWRlcigpDQorICAgICAgc3RhcnRNdWx0aXBhcnQoKQ0KKyAgICAgICAgICBwcmVhbWJsZSguLi4pDQorICAgICAgICAgIHN0YXJ0Qm9keVBhcnQoKQ0KKyAgICAgICAgICAgICAgc3RhcnRIZWFkZXIoKQ0KKyAgICAgICAgICAgICAgICAgIGZpZWxkKC4uLikNCisgICAgICAgICAgICAgICAgICBmaWVsZCguLi4pDQorICAgICAgICAgICAgICAgICAgLi4uDQorICAgICAgICAgICAgICBlbmRIZWFkZXIoKQ0KKyAgICAgICAgICAgICAgYm9keSgpDQorICAgICAgICAgIGVuZEJvZHlQYXJ0KCkNCisgICAgICAgICAgc3RhcnRCb2R5UGFydCgpDQorICAgICAgICAgICAgICBzdGFydEhlYWRlcigpDQorICAgICAgICAgICAgICAgICAgZmllbGQoLi4uKQ0KKyAgICAgICAgICAgICAgICAgIGZpZWxkKC4uLikNCisgICAgICAgICAgICAgICAgICAuLi4NCisgICAgICAgICAgICAgIGVuZEhlYWRlcigpDQorICAgICAgICAgICAgICBib2R5KCkNCisgICAgICAgICAgZW5kQm9keVBhcnQoKQ0KKyAgICAgICAgICBlcGlsb2d1ZSguLi4pDQorICAgICAgZW5kTXVsdGlwYXJ0KCkNCisgIGVuZE1lc3NhZ2UoKQ0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICANCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9hc2YtbG9nby1yZWR1Y2VkLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2NjMTAyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3NpdGUvcmVzb3VyY2VzL2ltYWdlcy9hc2YtbG9nby1yZWR1Y2VkLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2phbWVzLW1pbWU0ai1sb2dvLmdpZiBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3Jlc291cmNlcy9pbWFnZXMvamFtZXMtbWltZTRqLWxvZ28uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTY1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS9yZXNvdXJjZXMvaW1hZ2VzL2phbWVzLW1pbWU0ai1sb2dvLmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS9zaXRlLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3NpdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MTA3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS9zaXRlLnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tDQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKw0KKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICB1bmRlciB0aGUgTGljZW5zZS4gICAgDQorLS0+DQorPHByb2plY3QgbmFtZT0iSmFtZXMgbWltZTRqIj4KKyAgPGJhbm5lckxlZnQ+CisgICAgPG5hbWU+SkFNRVMgTWltZTRKPC9uYW1lPgorICAgIDxzcmM+aW1hZ2VzL2phbWVzLW1pbWU0ai1sb2dvLmdpZjwvc3JjPgorICAgIDxocmVmPmh0dHA6Ly9qYW1lcy5hcGFjaGUub3JnLzwvaHJlZj4KKyAgPC9iYW5uZXJMZWZ0PgorICA8YmFubmVyUmlnaHQ+DQorICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4NCisgICAgPHNyYz5pbWFnZXMvYXNmLWxvZ28tcmVkdWNlZC5naWY8L3NyYz4NCisgICAgPGhyZWY+aHR0cDovL3d3dy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+DQorICA8L2Jhbm5lclJpZ2h0PiANCisgIDxib2R5PgorICAgIDxtZW51IG5hbWU9Im1pbWU0aiI+CisgICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgaHJlZj0iL2luZGV4Lmh0bWwiLz4KKyAgICAgIDxpdGVtIG5hbWU9IlN0YXR1cyIgaHJlZj0iL3N0YXR1cy5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJFeGFtcGxlIiBocmVmPSIvc2FtcGxlcy5odG1sIi8+DQorICAgICAgPGl0ZW0gbmFtZT0iVXNhZ2UiIGhyZWY9Ii91c2FnZS5odG1sIi8+CisgICAgICA8aXRlbSBuYW1lPSJTdGFydCIgaHJlZj0iL3N0YXJ0L2luZGV4Lmh0bWwiIGNvbGxhcHNlPSJ0cnVlIj4KKyAgICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiIGhyZWY9Ii9zdGFydC9kb3dubG9hZC5odG1sIiBjb2xsYXBzZT0idHJ1ZSIvPg0KKyAgICAgICAgPGl0ZW0gbmFtZT0iQnVpbGQiIGhyZWY9Ii9zdGFydC9idWlsZC5odG1sIiBjb2xsYXBzZT0idHJ1ZSIvPgorICAgICAgPC9pdGVtPgorICAgIDwvbWVudT4KKyAgICAKKyAgICAke3JlcG9ydHN9DQorICAgIA0KKyAgICA8bWVudSBuYW1lPSJSZWxhdGVkIFByb2plY3RzIj4NCisgICAgCTxpdGVtIG5hbWU9Imh0dHBtaW1lIiBocmVmPSJodHRwOi8vaGMuYXBhY2hlLm9yZy9odHRwY29tcG9uZW50cy1jbGllbnQvaHR0cG1pbWUvaW5kZXguaHRtbCIgLz4NCisgICAgPC9tZW51PgorICA8L2JvZHk+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS94ZG9jL2luZGV4LnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3hkb2MvaW5kZXgueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOWMyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS94ZG9jL2luZGV4LnhtbApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Cis8IS0tIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKworIC0tPgorPGRvY3VtZW50PgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8dGl0bGU+TWltZTRqPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisgICAgPGJvZHk+CisgICAgICAgIDxzZWN0aW9uIG5hbWU9Ik1pbWU0aiI+CisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICBBcGFjaGUgTWltZTRqIGlzIGRldmVsb3BlZCBieSB0aGUgCisgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL2phbWVzLmFwYWNoZS5vcmcvIj5BcGFjaGUgSmFtZXM8L2E+IHRlYW0gYnV0IG5vdyBoYXMgYQorICAgICAgICAgICAgICAgIGRlZGljYXRlZCA8YSBocmVmPSJodHRwOi8vamFtZXMuYXBhY2hlLm9yZy9tYWlsLmh0bWwjTWltZTRqIj5tYWlsaW5nIGxpc3Q8L2E+LgorICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgPHA+IG1pbWU0aiBwcm92aWRlcyBhIHBhcnNlciwgCisgICAgICAgICAgICAgICAgPGEgaHJlZj0iYXBpZG9jcy9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVN0cmVhbVBhcnNlci5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+TWltZVN0cmVhbVBhcnNlcjwvY29kZT4KKyAgICAgICAgICAgICAgICA8L2E+LCBmb3IgZS1tYWlsIG1lc3NhZ2Ugc3RyZWFtcyBpbiBwbGFpbiByZmM4MjIgYW5kIE1JTUUKKyAgICAgICAgICAgICAgICBmb3JtYXQuIFRoZSBwYXJzZXIgdXNlcyBhIGNhbGxiYWNrIG1lY2hhbmlzbSB0byByZXBvcnQgcGFyc2luZworICAgICAgICAgICAgICAgIGV2ZW50cyBzdWNoIGFzIHRoZSBzdGFydCBvZiBhbiBlbnRpdHkgaGVhZGVyLCB0aGUgc3RhcnQgb2YgYQorICAgICAgICAgICAgICAgIGJvZHksIGV0Yy4gSWYgeW91IGFyZSBmYW1pbGlhciB3aXRoIHRoZSA8YQorICAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvIj5TQVg8L2E+IFhNTCBwYXJzZXIgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgeW91IHNob3VsZCBoYXZlIG5vIHByb2JsZW0gZ2V0dGluZyBzdGFydGVkIHdpdGggbWltZTRqLiA8L3A+CisgICAgICAgICAgICA8cD4gVGhlIHBhcnNlciBvbmx5IGRlYWxzIHdpdGggdGhlIHN0cnVjdHVyZSBvZiB0aGUgbWVzc2FnZSBzdHJlYW0uCisgICAgICAgICAgICAgICAgSXQgd29uJ3QgZG8gYW55IGRlY29kaW5nIG9mIGJhc2U2NCBvciBxdW90ZWQtcHJpbnRhYmxlIGVuY29kZWQKKyAgICAgICAgICAgICAgICBoZWFkZXIgZmllbGRzIGFuZCBib2RpZXMuIFRoaXMgaXMgaW50ZW50aW9uYWwgLSB0aGUgcGFyc2VyCisgICAgICAgICAgICAgICAgc2hvdWxkIG9ubHkgcHJvdmlkZSB0aGUgbW9zdCBiYXNpYyBmdW5jdGlvbmFsaXR5IG5lZWRlZCB0byBidWlsZAorICAgICAgICAgICAgICAgIG1vcmUgY29tcGxleCBwYXJzZXJzLiBIb3dldmVyLCBtaW1lNGogZG9lcyBpbmNsdWRlIGZhY2lsaXRpZXMgdG8KKyAgICAgICAgICAgICAgICBkZWNvZGUgYm9kaWVzIGFuZCBmaWVsZHMgYW5kIHRoZSA8Y29kZT5NZXNzYWdlPC9jb2RlPiBjbGFzcworICAgICAgICAgICAgICAgIGRlc2NyaWJlZCBiZWxvdyBoYW5kbGVzIGRlY29kaW5nIG9mIGZpZWxkcyBhbmQgYm9kaWVzCisgICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRseS4gPC9wPgorICAgICAgICAgICAgPHA+IFRoZSBwYXJzZXIgaGFzIGJlZW4gZGVzaWduZWQgdG8gYmUgZXh0cmVtZWx5IHRvbGVyYW50IGFnYWluc3QKKyAgICAgICAgICAgICAgICBtZXNzYWdlcyB2aW9sYXRpbmcgdGhlIHN0YW5kYXJkcy4gSXQgaGFzIGJlZW4gdGVzdGVkIHVzaW5nIGEKKyAgICAgICAgICAgICAgICBsYXJnZSBjb3JwdXMgKCZndDs1MDAwKSBvZiBlLW1haWwgbWVzc2FnZXMuIEFzIGEgYmVuY2htYXJrCisgICAgICAgICAgICAgICAgdGhlIHdpZGVseSB1c2VkIHBlcmwgPGNvZGU+TUlNRTo6VG9vbHM8L2NvZGU+CisgICAgICAgICAgICAgICAgcGFyc2VyIGhhcyBiZWVuIHVzZWQuIG1pbWU0aiBhbmQgTUlNRTpUb29scyByYXJlbHkgZGlmZmVyCisgICAgICAgICAgICAgICAgKCZsdDsyNSBpbiB0aG9zZSA1MDAwKS4gV2hlbiB0aGV5IGRvICh3aGljaCBvbmx5IG9jY3VycworICAgICAgICAgICAgICAgIGZvciBpbGxlZ2FsbHkgZm9ybWF0dGVkIHNwYW0gbWVzc2FnZXMpIHdlIHRoaW5rIG1pbWU0aiBkb2VzIGEKKyAgICAgICAgICAgICAgICBiZXR0ZXIgam9iLiA8L3A+CisgICAgICAgICAgICA8cD4gbWltZTRqIGNhbiBhbHNvIGJlIHVzZWQgdG8gYnVpbGQgYSB0cmVlIHJlcHJlc2VudGF0aW9uIG9mIGFuCisgICAgICAgICAgICAgICAgZS1tYWlsIG1lc3NhZ2UgdXNpbmcgdGhlIAorICAgICAgICAgICAgICAgIDxhIGhyZWY9ImFwaWRvY3Mvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9NZXNzYWdlLmh0bWwiPgorICAgICAgICAgICAgICAgICAgICA8Y29kZT5NZXNzYWdlPC9jb2RlPgorICAgICAgICAgICAgICAgIDwvYT4gY2xhc3MuIFVzaW5nIHRoaXMgZmFjaWxpdHkgbWltZTRqIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyB0aGUKKyAgICAgICAgICAgICAgICBkZWNvZGluZyBvZiBmaWVsZHMgYW5kIGJvZGllcyBhbmQgdXNlcyB0ZW1wb3JhcnkgZmlsZXMgZm9yIGxhcmdlCisgICAgICAgICAgICAgICAgYXR0YWNobWVudHMuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgc2ltaWxhciB0byB0aGUKKyAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBjb25zdHJ1Y3RlZCBieSB0aGUgSmF2YU1haWwgQVBJOnMgYnV0IGlzIG1vcmUKKyAgICAgICAgICAgICAgICB0b2xlcmFudCB0byBtZXNzYWdlcyB2aW9sYXRpbmcgdGhlIHN0YW5kYXJkcy4gPC9wPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3hkb2MvbmF2aWdhdGlvbi54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS94ZG9jL25hdmlnYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNTNjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS94ZG9jL25hdmlnYXRpb24ueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorCisgLS0+Cis8cHJvamVjdCBuYW1lPSJtaW1lNGoiPgorICAgIDx0aXRsZT5taW1lNGogLSB0aGUgSmF2YSBzdHJlYW0gYmFzZWQgTUlNRSBtZXNzYWdlIHBhcnNlcjwvdGl0bGU+CisgICAgPGJvZHk+CisgICAgICAgIDxsaW5rcz4KKyAgICAgICAgICAgIDxpdGVtIG5hbWU9IkhvbWUgUGFnZSIgaHJlZj0iaHR0cDovL3d3dy5taW1lNGoub3JnLyIvPgorICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQnJvd3NlIFNvdXJjZSBDb2RlIiBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvamFtZXMvbWltZTRqL3RydW5rLyIvPgorICAgICAgICA8L2xpbmtzPiAgICAgICAgCisgICAgICAgIDxtZW51IG5hbWU9Ik92ZXJ2aWV3Ij4KKyAgICAgICAgICAgIDwhLS08aXRlbSBuYW1lPSJGZWF0dXJlcyIgaHJlZj0iL2ZlYXR1cmVzLmh0bWwiLz4tLT4KKyAgICAgICAgICAgIDxpdGVtIG5hbWU9Ik5ld3MgYW5kIFN0YXR1cyIgaHJlZj0iL3N0YXR1cy5odG1sIi8+CisgICAgICAgICAgICA8aXRlbSBuYW1lPSJHZXR0aW5nIFN0YXJ0ZWQiIGhyZWY9Ii9zdGFydC9pbmRleC5odG1sIiBjb2xsYXBzZT0idHJ1ZSI+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiIGhyZWY9Ii9zdGFydC9kb3dubG9hZC5odG1sIi8+CisgICAgICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQnVpbGQiIGhyZWY9Ii9zdGFydC9idWlsZC5odG1sIi8+CisgICAgICAgICAgICA8L2l0ZW0+CisgICAgICAgIDwvbWVudT4KKyAgICAgICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Cis8IS0tICAgICAgICAgICAgPGl0ZW0gbmFtZT0iU2FtcGxlcyIgaHJlZj0iL3NhbXBsZXMuaHRtbCIvPi0tPgorICAgICAgICAgICAgPGl0ZW0gbmFtZT0iQVBJIGRvY3MgKEphdmFkb2MpIiBocmVmPSIvYXBpZG9jcy8iLz4KKyAgICAgICAgPC9tZW51PgorICAgIDwvYm9keT4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3hkb2Mvc2FtcGxlcy54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS94ZG9jL3NhbXBsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViZjEzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS94ZG9jL3NhbXBsZXMueG1sCkBAIC0wLDAgKzEsOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorCisgLS0+Cis8ZG9jdW1lbnQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDx0aXRsZT5TYW1wbGVzPC90aXRsZT4KKyAgICA8L3Byb3BlcnRpZXM+CisgICAgPGJvZHk+CisgICAgICAgIDxzZWN0aW9uIG5hbWU9IlNhbXBsZXMiPgorICAgICAgICAgICAgPHA+CisgICAgICAgICAgICBUaGUgTWltZTRqIGRpc3RyaWJ1dGlvbiBpbmNsdWRlcyBzYW1wbGVzCisgICAgICAgICAgICB3aGljaCBkZW1vbnN0cmF0ZSBob3cgdGhlIGxpYnJhcnkgY291bGQgYmUgdXNlZC4gVGhpcyBzZWN0aW9uCisgICAgICAgICAgICBnaXZlcyB5b3UgYSBzaG9ydCByZXZpZXcgb2YgdGhvc2Ugc2FtcGxlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIHlvdSBzaG91bGQgZG93bmxvYWQgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgc3R1ZHkgdGhlIHNhbXBsZSBzb3VyY2VzLgorICAgICAgICAgICAgVGhlIHNhbXBsZXMgYXJlIGluIHRoZSA8Y29kZT5leGFtcGxlcy88L2NvZGU+IHN1Yi1kaXJlY3RvcnkuCisgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TYW1wbGU8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuamFtZXMubWltZTRqLnNhbXBsZXMudHJlZS5NZXNzYWdlVHJlZTwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+RGlzcGxheXMgYSB0cmVlIG9mIHRoZSBjb250ZW50cyBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWltZTRqIDxjb2RlPk1lc3NhZ2U8L2NvZGU+IG9iamVjdCBpbiBhIFN3aW5nIEdVSS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbyB0cnkgaXQgb3V0IHJ1bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxibG9ja3F1b3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5qYXZhIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnNhbXBsZXMudHJlZS5NZXNzYWdlVHJlZSBwYXRoL3RvL21lc3NhZ2UubXNnPC9jb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3V0cHV0IGlzIHZlcnkgdXNlZnVsIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW91IHdhbnQgdGhlIHN0dWR5IHRoZSBzdHJ1Y3R1cmUgb2YgTUlNRSBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc2FtcGxlcy50cmFuc2Zvcm0uVHJhbnNmb3JtTWVzc2FnZTwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+SWxsdXN0cmF0ZSBob3cgdG8gdHJhbnNmb3JtIGEgbWVzc2FnZSBpbnRvIGFub3RoZXIgbWVzc2FnZSB3aXRob3V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmeWluZyB0aGUgb3JpZ2luYWwuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc2FtcGxlcy5kb20uVGV4dFBsYWluTWVzc2FnZTwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+SWxsdXN0cmF0ZSB0aGUgdXNlIG9mIE1pbWU0aiBET00gQVBJLiBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIGEgbWVzc2FnZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcnkgc2ltaWxhciB0byB0aGUgb25lIGZyb20gCisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM1MzIyLnR4dCI+UkZDIDUzMjI8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRpeCBBLjEuMS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5zYW1wbGVzLmRvbS5NdWx0aXBhcnRNZXNzYWdlPC9jb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5JbGx1c3RyYXRlIHRoZSB1c2Ugb2YgTWltZTRqIERPTSBBUEkuIFRoaXMgZXhhbXBsZSBjcmVhdGVzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBhcnQvbWl4ZWQgbWVzc2FnZSB0aGF0IGNvbnNpc3RzIG9mIGEgdGV4dC9wbGFpbiBhbmQgYW4gaW1hZ2UvcG5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydC4gVGhlIGltYWdlIGlzIGNyZWF0ZWQgb24gdGhlIGZseTsgYSBzaW1pbGFyIHRlY2huaXF1ZSBjYW4gYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNyZWF0ZSBQREYgb3IgWE1MIGF0dGFjaG1lbnRzLCBmb3IgZXhhbXBsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICA8IS0tICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUuamFtZXMubWltZTRqLnNhbXBsZXMuc2F4Lk1pbWUyU2F4PC9jb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc2FtcGxlcy5wZ3AuUEdQU2lnbmF0dXJlVmVyaWZpZXI8L2NvZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+IC0tPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L2JvZHk+Cis8L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3NpdGUveGRvYy9zdGFydC9idWlsZC54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvc2l0ZS94ZG9jL3N0YXJ0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmFhYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3NpdGUveGRvYy9zdGFydC9idWlsZC54bWwKQEAgLTAsMCArMSw5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgorPCEtLSAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisKKyAtLT4KKzxkb2N1bWVudD4KKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHRpdGxlPkJ1aWxkaW5nIG1pbWU0ajwvdGl0bGU+CisgICAgPC9wcm9wZXJ0aWVzPgorICAgIDxib2R5PgorICAgICAgICA8c2VjdGlvbiBuYW1lPSJCdWlsZGluZyBtaW1lNGoiPgorICAgICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iVXNpbmcgYSBTdGFibGUgUmVsZWFzZSI+CisgICAgICAgICAgICA8cD4gR28gdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYW1lcy5hcGFjaGUub3JnL2Rvd25sb2FkLmNnaSI+ZG93bmxvYWQgCisgICAgICAgICAgICAgIHBhZ2VzPC9hPiBhbmQgZG93bmxvYWQgdGhlIG1vc3QgcmVjZW50CisgICAgICAgICAgICAgICAgcmVsZWFzZSBpbiB5b3VyIHByZWZlcnJlZCBmb3JtYXQsIGVpdGhlcgorICAgICAgICAgICAgICAgIDxjb2RlPmphbWVzLW1pbWU0ai14Lnktc3JjLnRhci5nejwvY29kZT4gb3IgPGNvZGU+amFtZXMtbWltZTRqLXgueS1zcmMuemlwPC9jb2RlPi4KKyAgICAgICAgICAgICAgICBFeHRyYWN0aW5nIHRoZSBhcmNoaXZlZCBzb3VyY2VzIHdpbGwgY3JlYXRlIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICA8Y29kZT5qYW1lcy1taW1lNGoteC55LzwvY29kZT4uPC9wPgorICAgICAgICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQ2hlY2tpbmcgT3V0IEZyb20gU3VidmVyc2lvbiI+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIElzc3VlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgaW4gYSBzaGVsbDoKKyAgICAgICAgICAgICAgICAgICAgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5zdm4gY2hlY2tvdXQgaHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYW1lcy9taW1lNGovdHJ1bmsgamFtZXMtbWltZTRqPC9jb2RlPjxici8+CisgICAgICAgICAgICAgICAgICAgIDwvYmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICA8L3N1YnNlY3Rpb24+CisgICAgICAgICAgICA8c3Vic2VjdGlvbiBuYW1lPSJEb3dubG9hZCBhbmQgSW5zdGFsbCBNYXZlbiI+CisgICAgICAgICAgICAgICAgPHA+IFlvdSB3aWxsIG5lZWQgdG8gZG93bmxvYWQgYW5kIGluc3RhbGwgPGEKKyAgICAgICAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvIj5NYXZlbjwvYT4gYmVmb3JlIGJ1aWxkaW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSBzb3VyY2VzLiBUaGUgYnVpbGQgaGFzIGJlZW4gdGVzdGVkIHdpdGggdmVyc2lvbiAyLjAgb2YKKyAgICAgICAgICAgICAgICAgICAgTWF2ZW4gc28gdXNlIHRoaXMgb3IgYSBsYXRlciB2ZXJzaW9uIGlmIHBvc3NpYmxlLiA8L3A+CisgICAgICAgICAgICAgICAgPHA+IE9uZSBvZiB0aGUgbWFpbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIE1hdmVuIGFuZCBwbGFpbiBhbnQgaXMKKyAgICAgICAgICAgICAgICAgICAgdGhhdCBNYXZlbiBtYW5hZ2VzIGV4dGVybmFsIGRlcGVuZGVuY2llcyBmb3IgeW91ciBwcm9qZWN0cworICAgICAgICAgICAgICAgICAgICBhbmQgKGF0IGxlYXN0IGluIHRoZW9yeSkgeW91IHNob3VsZCBubyBsb25nZXIgaGF2ZSB0byBzdG9yZQorICAgICAgICAgICAgICAgICAgICB0aGlyZC1wYXJ0eSBqYXIgZmlsZXMgaW4geW91ciBzb3VyY2UgY29kZSB0cmVlLiBJdCBtYWludGFpbnMgYSBsb2NhbAorICAgICAgICAgICAgICAgICAgICByZXBvc2l0b3J5IG9mIHZlcnNpb25lZCBsaWJyYXJpZXMgYW5kIHNoYXJlcyB0aGVtIGJldHdlZW4KKyAgICAgICAgICAgICAgICAgICAgeW91ciBNYXZlbiBwcm9qZWN0cy4gSWYgaXQgY2FuJ3QgZmluZCB0aGUgbmVjZXNzYXJ5IGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHRoZXJlIGl0IHdpbGwgYXR0ZW1wdCB0byBkb3dubG9hZCB0aGVtIGZyb20gdGhlIG1haW4gTWF2ZW4KKyAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSBhdCB3d3cuaWJpYmxpby5vcmcvbWF2ZW4uIFNvIHRvIHVzZSB0aGUgTWF2ZW4KKyAgICAgICAgICAgICAgICAgICAgYnVpbGQsIHlvdSBuZWVkIHRvIGhhdmUgYSBuZXR3b3JrIGNvbm5lY3Rpb24gYXZhaWxhYmxlIGZvcgorICAgICAgICAgICAgICAgICAgICB0aGUgaW5pdGFsIGRvd25sb2FkIG9mIHRoZSBwcm9qZWN0IGRlcGVuZGVuY2llcy4gPC9wPgorICAgICAgICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iQnVpbGRpbmcgdGhlIG1pbWU0aiBKYXIiPgorICAgICAgICAgICAgICAgIDxwPiBPbmNlIE1hdmVuIGhhcyBiZWVuIGluc3RhbGxlZCwgYnVpbGRpbmcgdGhlIHByb2plY3Qgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgIGJlIGFzIHNpbXBsZSBhcyB0eXBpbmcgPGJsb2NrcXVvdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5jZCBqYW1lcy1taW1lNGoteC55LyAoY2QgamFtZXMtbWltZTRqLyBpZiBzb3VyY2VzIGNvbWUgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnZlcnNpb24pPGJyLz5tdm4gcGFja2FnZTwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgPC9ibG9ja3F1b3RlPiBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIE1hdmVuIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBydW4gYWxsIHRlc3QgY2FzZXMgZm9yIHlvdSBhbmQgY3JlYXRlIHRoZQorICAgICAgICAgICAgICAgICAgICBqYXIgZmlsZSBpbiB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPiBkaXJlY3RvcnkuIAorICAgICAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICAgICAgVG8gaW5zdGFsbCB0aGUgamFyIGludG8geW91ciBsb2NhbCBNYXZlbiByZXBvc2l0b3J5IHJ1biA8YmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm12biBpbnN0YWxsPC9jb2RlPjwvYmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgIFRvIGdlbmVyYXRlIGFuIEVjbGlwc2UgcHJvamVjdCBmcm9tIHRoZSBzb3VyY2VzIHJ1biA8YmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm12biBlY2xpcHNlOmVjbGlwc2U8L2NvZGU+PC9ibG9ja3F1b3RlPg0KKyAgICAgICAgICAgICAgICA8L3A+CisgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICA8c3Ryb25nPk5PVEUhPC9zdHJvbmc+IE1pbWU0aiB1c2VzIDxhIGhyZWY9Imh0dHBzOi8vamF2YWNjLmRldi5qYXZhLm5ldC8iPkphdmFDQzwvYT4gdG8gZ2VuZXJhdGUgcGFyc2VycyBmb3IKKyAgICAgICAgICAgICAgICAgIGhlYWRlciBmaWVsZHMuIElmIHlvdSdyZSB1c2luZyBhbiBvbGQgdmVyc2lvbiBvZiBtYXZlbiBlY2xpcHNlIHBsdWluZworICAgICAgICAgICAgICAgICAgPGNvZGU+bXZuIGVjbGlwc2U6ZWNsaXBzZTwvY29kZT4gY291bGQgaGF2ZSBwcm9ibGVtcyAgCisgICAgICAgICAgICAgICAgICBnZW5lcmF0aW5nIHByb3BlciBzb3VyY2UgZm9sZGVycyBmb3IgdGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZS4KKyAgICAgICAgICAgICAgICAgIEFmdGVyIHJ1bm5pbmcgPGNvZGU+bXZuIGVjbGlwc2U6ZWNsaXBzZTwvY29kZT4geW91IG11c3QgbWFudWFsbHkKKyAgICAgICAgICAgICAgICAgIGFkZCA8Y29kZT50YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvamF2YWNjPC9jb2RlPiBhbmQgCisgICAgICAgICAgICAgICAgICA8Y29kZT50YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvamp0cmVlPC9jb2RlPiBhcyBzb3VyY2UgZm9sZGVycworICAgICAgICAgICAgICAgICAgdW5kZXIgPGVtPlByb2plY3QgLSZndDsgUHJvcGVydGllczwvZW0+IGluIEVjbGlwc2UuCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB1c2luZworICAgICAgICAgICAgICAgICAgICBNYXZlbiwgaGF2ZSBhIGxvb2sgYXQgdGhlIDxhCisgICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8iPk1hdmVuIHdlYiBzaXRlPC9hPi4gPC9wPgorICAgICAgICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3hkb2Mvc3RhcnQvZG93bmxvYWQueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3NpdGUveGRvYy9zdGFydC9kb3dubG9hZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlMmY0NAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3hkb2Mvc3RhcnQvZG93bmxvYWQueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorCisgLS0+Cis8ZG9jdW1lbnQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDx0aXRsZT5Eb3dubG9hZGluZyBtaW1lNGo8L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKyAgICA8Ym9keT4KKyAgICAgICAgPHNlY3Rpb24gbmFtZT0iRG93bmxvYWRpbmcgbWltZTRqIj4KKyAgICAgICAgICAgIDxwPiBHbyB0byB0aGUgPGEgaHJlZj0iaHR0cDovL2phbWVzLmFwYWNoZS5vcmcvZG93bmxvYWQuY2dpIj5kb3dubG9hZCAKKyAgICAgICAgICAgICAgcGFnZXM8L2E+IGFuZCBkb3dubG9hZCB0aGUgbW9zdCByZWNlbnQKKyAgICAgICAgICAgICAgICByZWxlYXNlIGluIHlvdXIgcHJlZmVycmVkIGZvcm1hdCwgZWl0aGVyCisgICAgICAgICAgICAgICAgPGNvZGU+amFtZXMtbWltZTRqLXgueS50YXIuZ3o8L2NvZGU+IG9yIDxjb2RlPmphbWVzLW1pbWU0ai14LnkuemlwPC9jb2RlPi4KKyAgICAgICAgICAgICAgICBFeHRyYWN0aW5nIHRoZSBhcmNoaXZlIHdpbGwgY3JlYXRlIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICA8Y29kZT5qYW1lcy1taW1lNGoteC55LzwvY29kZT4gd2hpY2ggY29udGFpbnMgdGhlIG1pbWU0aiBqYXIgZmlsZSBhbmQKKyAgICAgICAgICAgICAgICB0aGUgQVBJIGRvY3MuPC9wPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3hkb2Mvc3RhcnQvaW5kZXgueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3NpdGUveGRvYy9zdGFydC9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3MjIxZAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy9zaXRlL3hkb2Mvc3RhcnQvaW5kZXgueG1sCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KKzwhLS0gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorCisgLS0+Cis8ZG9jdW1lbnQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDx0aXRsZT5HZXR0aW5nIFN0YXJ0ZWQgd2l0aCBtaW1lNGo8L3RpdGxlPgorICAgIDwvcHJvcGVydGllcz4KKyAgICA8Ym9keT4KKyAgICAgICAgPHNlY3Rpb24gbmFtZT0iR2V0dGluZyBTdGFydGVkIHdpdGggbWltZTRqIj4KKyAgICAgICAgICAgIDxzdWJzZWN0aW9uIG5hbWU9Ik92ZXJ2aWV3IG9mIHRoZSBHZXR0aW5nIFN0YXJ0ZWQgRG9jdW1lbnRhdGlvbiI+CisgICAgICAgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+RG9jdW1lbnQ8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9ImRvd25sb2FkLmh0bWwiPkRvd25sb2FkPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4gQmVmb3JlIHlvdSBjYW4gc3RhcnQgdXNpbmcgbWltZTRqLCB5b3UnbGwgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkIHRoZSBkaXN0cmlidXRpb24gdG8geW91ciBzeXN0ZW0gKHVubGVzcyB5b3UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuIG9uIGJ1aWxkaW5nIHRoZSBwcm9qZWN0IGZyb20gc291cmNlKS4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50IHByb3ZpZGVzIGxpbmtzIHRvIHRoZSB2YXJpb3VzIGRpc3RyaWJ1dGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJidWlsZC5odG1sIj5CdWlsZGluZyBtaW1lNGo8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorCQkJCURlc2NyaWJlcyBob3cgdG8gYnVpbGQgbWltZTRqIGZyb20gdGhlIHNvdXJjZXMuIAorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9zdWJzZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9ib2R5PgorPC9kb2N1bWVudD4KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovRW5jb2RlVXRpbHMuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovRW5jb2RlVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY4MDM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9FbmNvZGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqOworCisKK3B1YmxpYyBjbGFzcyBFbmNvZGVVdGlscyB7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFTSyA9IDB4M0Y7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklSU1RfTUFTSyA9IE1BU0sgPDwgMTg7IAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQ09ORF9NQVNLID0gTUFTSyA8PCAxMjsgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVEhJUkRfTUFTSyA9IE1BU0sgPDwgNjsgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SVEhfTUFTSyA9IE1BU0s7IAorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEVOQ09ESU5HID0geydBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLCAnSScsICdKJywgJ0snLCAnTCcsICdNJywgJ04nLAorICAgICAgICAnTycsICdQJyAsJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLAorICAgICAgICAnaicsICdrJywgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywgJzAnLCAnMScsICcyJywgJzMnLAorICAgICAgICAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnKycsICcvJ307CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHsoYnl0ZSkgMCwgKGJ5dGUpIDEyOCwgKGJ5dGUpIDB9OworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyh0b0Jhc2U2NChieXRlcykpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcodG9CYXNlNjQoIkhlbGxvLCBXb3JsZCIuZ2V0Qnl0ZXMoKSkpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcodG9CYXNlNjQoIk1vbmRheSIuZ2V0Qnl0ZXMoKSkpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcodG9CYXNlNjQoIk1cdTAwRjZuY2hlbmdsYWRiYWNoXHJcbiIuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSkpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gdG9CYXNlNjQoYnl0ZVtdIGluKSB7CisgICAgICAgIGludCBpbnB1dExlbmd0aCA9IGluLmxlbmd0aDsKKyAgICAgICAgaW50IG91dHB1dExlbmd0aCA9IChpbnQpIE1hdGguZmxvb3IoKDQqaW5wdXRMZW5ndGgpIC8gM2YpICsgMzsKKyAgICAgICAgb3V0cHV0TGVuZ3RoID0gb3V0cHV0TGVuZ3RoICsgMiAqIChpbnQpIE1hdGguZmxvb3Iob3V0cHV0TGVuZ3RoIC8gNzZmKTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdHMgPSBuZXcgYnl0ZVtvdXRwdXRMZW5ndGhdOworICAgICAgICBpbnQgaW5wdXRJbmRleCA9IDA7CisgICAgICAgIGludCBvdXRwdXRJbmRleCA9IDA7CisgICAgICAgIHdoaWxlIChpbnB1dExlbmd0aCAtIGlucHV0SW5kZXggPiAyKSB7CisgICAgICAgICAgICBpbnQgb25lID0gKHRvSW50KGluW2lucHV0SW5kZXgrK10pIDw8IDE2KTsKKyAgICAgICAgICAgIGludCB0d28gPSAodG9JbnQoaW5baW5wdXRJbmRleCsrXSkgPDwgOCk7CisgICAgICAgICAgICBpbnQgdGhyZWUgPSB0b0ludChpbltpbnB1dEluZGV4KytdKTsKKyAgICAgICAgICAgIGludCBxdWFudHVtID0gb25lIHwgdHdvIHwgdGhyZWU7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAocXVhbnR1bSAmIEZJUlNUX01BU0spID4+IDE4OworICAgICAgICAgICAgb3V0cHV0SW5kZXggPSBzZXRSZXN1bHQocmVzdWx0cywgb3V0cHV0SW5kZXgsIEVOQ09ESU5HW2luZGV4XSk7CisgICAgICAgICAgICBpbmRleCA9IChxdWFudHVtICYgU0VDT05EX01BU0spID4+IDEyOworICAgICAgICAgICAgb3V0cHV0SW5kZXggPSBzZXRSZXN1bHQocmVzdWx0cywgb3V0cHV0SW5kZXgsIEVOQ09ESU5HW2luZGV4XSk7CisgICAgICAgICAgICBpbmRleCA9IChxdWFudHVtICYgVEhJUkRfTUFTSykgPj4gNjsKKyAgICAgICAgICAgIG91dHB1dEluZGV4ID0gc2V0UmVzdWx0KHJlc3VsdHMsIG91dHB1dEluZGV4LCBFTkNPRElOR1tpbmRleF0pOworICAgICAgICAgICAgaW5kZXggPSAocXVhbnR1bSAmIEZPUlRIX01BU0spOworICAgICAgICAgICAgb3V0cHV0SW5kZXggPSBzZXRSZXN1bHQocmVzdWx0cywgb3V0cHV0SW5kZXgsIEVOQ09ESU5HW2luZGV4XSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAoaW5wdXRMZW5ndGggLSBpbnB1dEluZGV4KSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaW50IHF1YW50dW0gPSBpbltpbnB1dEluZGV4KytdIDw8IDE2OworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IChxdWFudHVtICYgRklSU1RfTUFTSykgPj4gMTg7CisgICAgICAgICAgICAgICAgb3V0cHV0SW5kZXggPSBzZXRSZXN1bHQocmVzdWx0cywgb3V0cHV0SW5kZXgsIEVOQ09ESU5HW2luZGV4XSk7CisgICAgICAgICAgICAgICAgaW5kZXggPSAocXVhbnR1bSAmIFNFQ09ORF9NQVNLKSA+PiAxMjsKKyAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCA9IHNldFJlc3VsdChyZXN1bHRzLCBvdXRwdXRJbmRleCwgRU5DT0RJTkdbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCA9IHNldFJlc3VsdChyZXN1bHRzLCBvdXRwdXRJbmRleCwgKGJ5dGUpICc9Jyk7CisgICAgICAgICAgICAgICAgb3V0cHV0SW5kZXggPSBzZXRSZXN1bHQocmVzdWx0cywgb3V0cHV0SW5kZXgsIChieXRlKSAnPScpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHF1YW50dW0gPSAoaW5baW5wdXRJbmRleCsrXSA8PCAxNikgKyAoaW5baW5wdXRJbmRleCsrXSA8PCA4KTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IChxdWFudHVtICYgRklSU1RfTUFTSykgPj4gMTg7CisgICAgICAgICAgICAgICAgb3V0cHV0SW5kZXggPSBzZXRSZXN1bHQocmVzdWx0cywgb3V0cHV0SW5kZXgsIEVOQ09ESU5HW2luZGV4XSk7CisgICAgICAgICAgICAgICAgaW5kZXggPSAocXVhbnR1bSAmIFNFQ09ORF9NQVNLKSA+PiAxMjsKKyAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCA9IHNldFJlc3VsdChyZXN1bHRzLCBvdXRwdXRJbmRleCwgRU5DT0RJTkdbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IChxdWFudHVtICYgVEhJUkRfTUFTSykgPj4gNjsKKyAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCA9IHNldFJlc3VsdChyZXN1bHRzLCBvdXRwdXRJbmRleCwgRU5DT0RJTkdbaW5kZXhdKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRJbmRleCA9IHNldFJlc3VsdChyZXN1bHRzLCBvdXRwdXRJbmRleCwgKGJ5dGUpICc9Jyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCB0b0ludChieXRlIGIpIHsKKyAgICAgICAgcmV0dXJuIDI1NSAmIGI7CisgICAgfQorCisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2V0UmVzdWx0KGJ5dGVbXSByZXN1bHRzLCBpbnQgb3V0cHV0SW5kZXgsIGJ5dGUgdmFsdWUpIHsKKyAgICAgICAgcmVzdWx0c1tvdXRwdXRJbmRleCsrXSA9IHZhbHVlOworICAgICAgICBvdXRwdXRJbmRleCA9IGNoZWNrTGluZUxlbmd0aChyZXN1bHRzLCBvdXRwdXRJbmRleCk7CisgICAgICAgIHJldHVybiBvdXRwdXRJbmRleDsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGludCBjaGVja0xpbmVMZW5ndGgoYnl0ZVtdIHJlc3VsdHMsIGludCBvdXRwdXRJbmRleCkgeworICAgICAgICBpZiAob3V0cHV0SW5kZXggPT0gNzYgfHwgb3V0cHV0SW5kZXggPiA3NiAmJiAob3V0cHV0SW5kZXggLSAyKk1hdGguZmxvb3Iob3V0cHV0SW5kZXgvNzZmIC0gMSkpICUgNzYgPT0gMCkgeworICAgICAgICAgICAgcmVzdWx0c1tvdXRwdXRJbmRleCsrXSA9ICdccic7CisgICAgICAgICAgICByZXN1bHRzW291dHB1dEluZGV4KytdID0gJ1xuJzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0cHV0SW5kZXg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9FeGFtcGxlTWFpbC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9FeGFtcGxlTWFpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTQwYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL0V4YW1wbGVNYWlsLmphdmEKQEAgLTAsMCArMSw2OTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGo7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CisKK3B1YmxpYyBjbGFzcyBFeGFtcGxlTWFpbCB7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9NVUxUSVBBUlRfRU1CRURERURfTUVTU0FHRVNfSU5ORVJfTVVMVElQQVJUX01JWEVEID0gIi0tNC42NjkyMDE2MDkxMDI5OVxyXG4iICsgCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBpbWFnZS9naWZcclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iICsgCisgICAgICAgICAgICAiTUlNRS1WZXJzaW9uOiAxLjBcclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtSUQ6IDIzODQ3ODkzNDcyMzg0NzIzODk0Nzg5MjM3NFxyXG4iICsgCisgICAgICAgICAgICAiQ29udGVudC1EZXNjcmlwdGlvbjogQm9ndXMgSW1hZ2UgRGF0YVxyXG4iICsgCisgICAgICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgICAgICJBQkNERkVHSElKS0xNTk9cclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiLS00LjY2OTIwMTYwOTEwMjk5XHJcbiIgKyAKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyXHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIkZyb206IFRpbW90aHkgVGF5bGVyIDx0aW1vdGh5QGV4YW1wbGUub3JnPlxyXG4iICsgCisgICAgICAgICAgICAiVG86IEpvaG4gU21pdGggPGpvaG5AZXhhbXBsZS5vcmc+XHJcbiIgKyAKKyAgICAgICAgICAgICJEYXRlOiBTYXQsIDE2IEZlYiAyMDA4IDEyOjAwOjAwICswMDAwIChHTVQpXHJcbiIgKyAKKyAgICAgICAgICAgICJTdWJqZWN0OiBBbm90aGVyIEV4YW1wbGUgRW1haWxcclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PTIuNTAyOTA3ODc1MDlcclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiWWV0IGFub3RoZXIgcHJlYW1ibGVcclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiLS0yLjUwMjkwNzg3NTA5XHJcbiIgKyAKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiUmh1YmFyZCBBTkQgQ3VzdGFyZCFcclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiLS0yLjUwMjkwNzg3NTA5XHJcbiIgKyAKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTtib3VuZGFyeT0zLjI0M0Y2QTg4ODVBMzA4RDNcclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiLS0zLjI0M0Y2QTg4ODVBMzA4RDNcclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblxyXG4iICsgCisgICAgICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgICAgICJSaHViYXJkP0N1c3RhcmQ/XHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIi0tMy4yNDNGNkE4ODg1QTMwOEQzXHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9yaWNodGV4dFxyXG4iICsgCisgICAgICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgICAgICJSaHViYXJkP0N1c3RhcmQ/XHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIi0tMy4yNDNGNkE4ODg1QTMwOEQzLS1cclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiLS0yLjUwMjkwNzg3NTA5LS1cclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiLS00LjY2OTIwMTYwOTEwMjk5LS0iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9NVUxUSVBBUlRfRU1CRURERURfTUVTU0FHRVNfSU5ORVJfTUFJTCA9ICJGcm9tOiBUaW1vdGh5IFRheWxlciA8dGltb3RoeUBleGFtcGxlLm9yZz5cclxuIiArIAorICAgICAgICAgICAgIlRvOiBTYW11YWwgU21pdGggPHNhbXVhbEBleGFtcGxlLm9yZz5cclxuIiArIAorICAgICAgICAgICAgIkRhdGU6IFRodSwgMTQgRmViIDIwMDggMTI6MDA6MDAgKzAwMDAgKEdNVClcclxuIiArIAorICAgICAgICAgICAgIlN1YmplY3Q6IEEgTXVsdGlwYXJ0IEFsdGVybmF0aXZlIEVtYWlsXHJcbiIgKyAKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTtib3VuZGFyeT00MlxyXG4iICsgCisgICAgICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgICAgICJUaGlzIG1lc3NhZ2UgaGFzIGEgcHJlbWFibGVcclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICAiLS00MlxyXG4iICsgCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIkN1c3RhcmQhXHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIi0tNDJcclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIkNVU1RBUkRDVVNUQVJEQ1VTVEFSRFxyXG4iICsgCisgICAgICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgICAgICItLTQyLS1cclxuIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfTVVMVElQQVJUX0VNQkVEREVEX01FU1NBR0VTX0JPRFkgPSAiU3RhcnQgd2l0aCBhIHByZWFtYmxlXHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIi0tMTcyOVxyXG4iICsgCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIlJodWJhcmIhXHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgIi0tMTcyOVxyXG4iICsgCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iICsgCisgICAgICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgICAgICI5ODc2NTQzMjFBSFBMQVxyXG4iICsgCisgICAgICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgICAgICItLTE3MjlcclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjJcclxuIiArIAorICAgICAgICAgICAgIlxyXG4iICsgCisgICAgICAgICAgICBNSU1FX01VTFRJUEFSVF9FTUJFRERFRF9NRVNTQUdFU19JTk5FUl9NQUlMICsgCisgICAgICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgICAgICItLTE3MjlcclxuIiArIAorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT00LjY2OTIwMTYwOTEwMjk5XHJcbiIgKyAKKyAgICAgICAgICAgICJcclxuIiArIAorICAgICAgICAgICAgTUlNRV9NVUxUSVBBUlRfRU1CRURERURfTUVTU0FHRVNfSU5ORVJfTVVMVElQQVJUX01JWEVEICsgIlxyXG4iICsKKyAgICAgICAgICAgICItLTE3MjktLVxyXG4iICsgCisgICAgICAgICAgICAiXHJcbiI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUQ1X0NPTlRFTlQgPSAiUTJobFkyc2dTVzUwWldkeWFYUjVJUT09IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0RFU0NSSVBUSU9OID0gIkJsYWggYmxhaCBibGFoIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0lEID0gIjxmNDcwZjY4ZTA4MDMwNjEwMDJuMjJiYzQxMjRoZTE0MDE1YTRiNmQ2MzI3ZkBtYWlsLmdtYWlsLmNvbT4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhcnNldCBVU19BU0NJSSA9IENoYXJzZXRVdGlsLlVTX0FTQ0lJOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhcnNldCBMQVRJTjEgPSBDaGFyc2V0VXRpbC5JU09fODg1OV8xOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfTVVMVElQQVJUX0VNQkVEREVEX01FU1NBR0VTID0gCisgICAgICAgICJGcm9tOiBUaW1vdGh5IFRheWxlciA8dGltb3RoeUBleGFtcGxlLm9yZz5cclxuIiArIAorICAgICAgICAiVG86IFNhbXVhbCBTbWl0aCA8c2FtdWFsQGV4YW1wbGUub3JnPlxyXG4iICsgCisgICAgICAgICJEYXRlOiBUaHUsIDE0IEZlYiAyMDA4IDEyOjAwOjAwICswMDAwIChHTVQpXHJcbiIgKyAKKyAgICAgICAgIlN1YmplY3Q6IEEgTXVsdGlwYXJ0IEVtYWlsXHJcbiIgKyAKKyAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PTE3MjlcclxuIiArIAorICAgICAgICAiXHJcbiIgKyAKKyAgICAgICAgTUlNRV9NVUxUSVBBUlRfRU1CRURERURfTUVTU0FHRVNfQk9EWTsgCisKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlRfV0lUSF9DT05URU5UX0xPQ0FUSU9OID0gCisgICAgICAgICJGcm9tOiBUaW1vdGh5IFRheWxlciA8dGltb3RoeUBleGFtcGxlLm9yZz5cclxuIiArCisgICAgICAgICJUbzogU2FtdWFsIFNtaXRoIDxzYW11YWxAZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICAgICAiRGF0ZTogVGh1LCAxNCBGZWIgMjAwOCAxMjowMDowMCArMDAwMCAoR01UKVxyXG4iICsKKyAgICAgICAgIlN1YmplY3Q6IEEgTXVsdGlwYXJ0IEVtYWlsIFdpdGggQ29udGVudC1Mb2NhdGlvblxyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PTE3MjlcclxuXHJcbiIgKworICAgICAgICAiU3RhcnQgd2l0aCBhIHByZWFtYmxlXHJcbiIgKworICAgICAgICAiXHJcbi0tMTcyOVxyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veGh0bWwreG1sXHJcbiIgKworICAgICAgICAiQ29udGVudC1Mb2NhdGlvbjogcmVsYXRpdmUvdXJsXHJcblxyXG4iICsKKyAgICAgICAgIjwhRE9DVFlQRSBodG1sXHJcbiIgKworICAgICAgICAiUFVCTElDIFwiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU5cIlxyXG4iICsKKyAgICAgICAgIlwiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZFwiPlxyXG4iICsKKyAgICAgICAgIjxodG1sPjxoZWFkPjx0aXRsZT5SaHViYXJiPC90aXRsZT48L2hlYWQ+PGJvZHk+Umh1YmFyYiE8L2JvZHk+PC9odG1sPlxyXG4iICsKKyAgICAgICAgIlxyXG4tLTE3MjlcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArCisgICAgICAgICJDb250ZW50LUxvY2F0aW9uOiBodHRwOi8vd3d3LmV4YW1wbGUub3JnL2Fic29sdXRlL3JodWJhcmQudHh0XHJcblxyXG4iICsKKyAgICAgICAgIlJodWJhcmIhXHJcbiIgKworICAgICAgICAiXHJcbi0tMTcyOVxyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVTLUFTQ0lJXHJcblxyXG4iICsKKyAgICAgICAgIjxodG1sPjxoZWFkPjx0aXRsZT5SaHViYXJiPC90aXRsZT48L2hlYWQ+PGJvZHk+Umh1YmFyYiE8L2JvZHk+PC9odG1sPlxyXG4iICsKKyAgICAgICAgIlxyXG4tLTE3MjlcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArCisgICAgICAgICJDb250ZW50LUxvY2F0aW9uOiAoU29tZSBjb21tZW50KSBcImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvYWJzb2x1dGUvY29tbWVudHMvcmh1YmFyZC50eHRcIihBbm90aGVyIGNvbW1lbnQpXHJcblxyXG4iICsKKyAgICAgICAgIlJodWJhcmIhXHJcbiIgKworICAgICAgICAiXHJcbi0tMTcyOVxyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVTLUFTQ0lJXHJcbiIgKworICAgICAgICAiQ29udGVudC1Mb2NhdGlvbjpcImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvdGhpcy9cclxuIiArCisgICAgICAgICIgICAgICAgICAgaXMvYS92ZXJ5L2xvbmcvdXJsL3NwbGl0L1xyXG4iICsKKyAgICAgICAgIiAgICAgICAgICBvdmVyL3R3by9saW5lcy9cIlxyXG5cclxuIiArCisgICAgICAgICI8aHRtbD48aGVhZD48dGl0bGU+Umh1YmFyYjwvdGl0bGU+PC9oZWFkPjxib2R5PlJodWJhcmIhPC9ib2R5PjwvaHRtbD5cclxuIiArCisgICAgICAgICJcclxuLS0xNzI5LS1cclxuIiArCisgICAgICAgICJUaGlzIGlzIHRoZSBlcGlsb2d1ZVxyXG4iOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJUEFSVF9XSVRIX0JJTkFSWV9BVFRBQ0hNRU5UUyA9IAorICAgICAgICAiUmV0dXJuLVBhdGg6IDxyb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWs+XHJcbiIgKworICAgICAgICAiUmVjZWl2ZWQ6IChxbWFpbCAxODU1NCBpbnZva2VkIGZyb20gbmV0d29yayk7IDI1IE1heSAyMDA4IDE0OjM4OjUzIC0wMDAwXHJcbiIgKworICAgICAgICAiUmVjZWl2ZWQ6IGZyb20gdW5rbm93biAoSEVMTyBwM3ByZXNtdHAwMS0xNi5wcm9kLnBoeDMuc2VjdXJlc2VydmVyLm5ldClcclxuIiArCisgICAgICAgICIgICAgICAgIChbMjA4LjEwOS44MC4xNjVdKSAoZW52ZWxvcGUtc2VuZGVyIDxyZG9ua2luLW93bmVyQGxvY3VzLmFwYWNoZS5vcmc+KSBieVxyXG4iICsKKyAgICAgICAgIiAgICAgICAgc210cDIwLTAxLnByb2QubWVzYTEuc2VjdXJlc2VydmVyLm5ldCAocW1haWwtMS4wMykgd2l0aCBTTVRQIGZvclxyXG4iICsKKyAgICAgICAgIiAgICAgICAgPGFzZkB4bWxtYXB0Lm9yZz47IDI1IE1heSAyMDA4IDE0OjM4OjUzIC0wMDAwXHJcbiIgKworICAgICAgICAiUmVjZWl2ZWQ6IChxbWFpbCA5NzUxIGludm9rZWQgZnJvbSBuZXR3b3JrKTsgMjUgTWF5IDIwMDggMTQ6Mzg6NTMgLTAwMDBcclxuIiArCisgICAgICAgICJSZWNlaXZlZDogZnJvbSBtaW5vdGF1ci5hcGFjaGUub3JnIChbMTQwLjIxMS4xMS45XSkgKGVudmVsb3BlLXNlbmRlclxyXG4iICsKKyAgICAgICAgIiAgICAgICAgPHJkb25raW4tb3duZXJAbG9jdXMuYXBhY2hlLm9yZz4pIGJ5XHJcbiIgKworICAgICAgICAiICAgICAgICBwM3ByZXNtdHAwMS0xNi5wcm9kLnBoeDMuc2VjdXJlc2VydmVyLm5ldCAocW1haWwtbGRhcC0xLjAzKSB3aXRoIFNNVFAgZm9yXHJcbiIgKworICAgICAgICAiICAgICAgICA8YXNmQHhtbG1hcHQub3JnPjsgMjUgTWF5IDIwMDggMTQ6Mzg6NTAgLTAwMDBcclxuIiArCisgICAgICAgICJSZWNlaXZlZDogKHFtYWlsIDQ2NzY4IGludm9rZWQgYnkgdWlkIDEyODkpOyAyNSBNYXkgMjAwOCAxNDozODo0NiAtMDAwMFxyXG4iICsKKyAgICAgICAgIkRlbGl2ZXJlZC1UbzogcmRvbmtpbkBsb2N1cy5hcGFjaGUub3JnXHJcbiIgKworICAgICAgICAiUmVjZWl2ZWQ6IChxbWFpbCA0Njc2MyBpbnZva2VkIGZyb20gbmV0d29yayk7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwXHJcbiIgKworICAgICAgICAiUmVjZWl2ZWQ6IGZyb20gaGVybWVzLmFwYWNoZS5vcmcgKEhFTE8gbWFpbC5hcGFjaGUub3JnKSAoMTQwLjIxMS4xMS4yKSBieVxyXG4iICsKKyAgICAgICAgIiAgICAgICAgbWlub3RhdXIuYXBhY2hlLm9yZyB3aXRoIFNNVFA7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwXHJcbiIgKworICAgICAgICAiUmVjZWl2ZWQ6IChxbWFpbCA2MTI3NSBpbnZva2VkIGJ5IHVpZCA1MDApOyAyNSBNYXkgMjAwOCAxNDozODo0OCAtMDAwMFxyXG4iICsKKyAgICAgICAgIkRlbGl2ZXJlZC1UbzogYXBtYWlsLXJkb25raW5AYXBhY2hlLm9yZ1xyXG4iICsKKyAgICAgICAgIkRlbGl2ZXJlZC1Ubzogcm9iQGxvY2FsaG9zdFxyXG4iICsKKyAgICAgICAgIkRlbGl2ZXJlZC1Ubzogcm9iQGxvY2FsaG9zdFxyXG4iICsKKyAgICAgICAgIlJlY2VpdmVkOiAocW1haWwgNjEyNzIgaW52b2tlZCBieSB1aWQgOTkpOyAyNSBNYXkgMjAwOCAxNDozODo0OCAtMDAwMFxyXG4iICsKKyAgICAgICAgIlJlY2VpdmVkOiBmcm9tIGF0aGVuYS5hcGFjaGUub3JnIChIRUxPIGF0aGVuYS5hcGFjaGUub3JnKSAoMTQwLjIxMS4xMS4xMzYpXHJcbiIgKworICAgICAgICAiICAgICAgICBieSBhcGFjaGUub3JnIChxcHNtdHBkLzAuMjkpIHdpdGggRVNNVFA7IFN1biwgMjUgTWF5IDIwMDggMDc6Mzg6NDggLTA3MDBcclxuIiArCisgICAgICAgICJYLUFTRi1TcGFtLVN0YXR1czogTm8sIGhpdHM9LTAuMCByZXF1aXJlZD0xMC4wIHRlc3RzPVNQRl9QQVNTXHJcbiIgKworICAgICAgICAiWC1TcGFtLUNoZWNrLUJ5OiBhcGFjaGUub3JnXHJcbiIgKworICAgICAgICAiUmVjZWl2ZWQtU1BGOiBwYXNzIChhdGhlbmEuYXBhY2hlLm9yZzogZG9tYWluIG9mXHJcbiIgKworICAgICAgICAiICAgICAgICByb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWsgZGVzaWduYXRlcyAxOTUuMTg4LjIxMy41IGFzIHBlcm1pdHRlZFxyXG4iICsKKyAgICAgICAgIiAgICAgICAgc2VuZGVyKVxyXG4iICsKKyAgICAgICAgIlJlY2VpdmVkOiBmcm9tIFsxOTUuMTg4LjIxMy41XSAoSEVMTyBzbXRwLW91dDIuYmx1ZXlvbmRlci5jby51aylcclxuIiArCisgICAgICAgICIgICAgICAgICgxOTUuMTg4LjIxMy41KSBieSBhcGFjaGUub3JnIChxcHNtdHBkLzAuMjkpIHdpdGggRVNNVFA7IFN1biwgMjUgTWF5IDIwMDhcclxuIiArCisgICAgICAgICIgICAgICAgIDE0OjM4OjAwICswMDAwXHJcbiIgKworICAgICAgICAiUmVjZWl2ZWQ6IGZyb20gWzE3Mi4yMy4xNzAuMTQwXSAoaGVsbz1hbnRpLXZpcnVzMDItMDcpIGJ5XHJcbiIgKworICAgICAgICAiICAgICAgICBzbXRwLW91dDIuYmx1ZXlvbmRlci5jby51ayB3aXRoIHNtdHAgKEV4aW0gNC41MikgaWQgMUswSE1WLTAwMDg3ZS1IWSBmb3JcclxuIiArCisgICAgICAgICIgICAgICAgIHJkb25raW5AYXBhY2hlLm9yZzsgU3VuLCAyNSBNYXkgMjAwOCAxNTozODoxNSArMDEwMFxyXG4iICsKKyAgICAgICAgIlJlY2VpdmVkOiBmcm9tIFs4Mi4zOC42NS42XSAoaGVsbz1bMTAuMC4wLjI3XSkgYnlcclxuIiArCisgICAgICAgICIgICAgICAgIGFzbXRwLW91dDUuYmx1ZXlvbmRlci5jby51ayB3aXRoIGVzbXRwYSAoRXhpbSA0LjUyKSBpZCAxSzBITVUtMDAwMUEyLTNxIGZvclxyXG4iICsKKyAgICAgICAgIiAgICAgICAgcmRvbmtpbkBhcGFjaGUub3JnOyBTdW4sIDI1IE1heSAyMDA4IDE1OjM4OjE0ICswMTAwXHJcbiIgKworICAgICAgICAiU3ViamVjdDogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbXVsdGlwYXJ0IG1peGVkIGVtYWlsIHdpdGggaW1hZ2UgY29udGVudFxyXG4iICsKKyAgICAgICAgIkZyb206IFJvYmVydCBCdXJyZWxsIERvbmtpbiA8cm9iZXJ0YnVycmVsbGRvbmtpbkBibHVleW9uZGVyLmNvLnVrPlxyXG4iICsKKyAgICAgICAgIlRvOiBSb2JlcnQgQnVycmVsbCBEb25raW4gPHJkb25raW5AYXBhY2hlLm9yZz5cclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9XCI9LXRJZEdZVnN0UUpnaHlFREFUbkorXCJcclxuIiArCisgICAgICAgICJEYXRlOiBTdW4sIDI1IE1heSAyMDA4IDE1OjM4OjEzICswMTAwXHJcbiIgKworICAgICAgICAiTWVzc2FnZS1JZDogPDEyMTE3MjYyOTMuNTc3Mi4xMC5jYW1lbEBsb2NhbGhvc3Q+XHJcbiIgKworICAgICAgICAiTWltZS1WZXJzaW9uOiAxLjBcclxuIiArCisgICAgICAgICJYLU1haWxlcjogRXZvbHV0aW9uIDIuMTIuMyBcclxuIiArCisgICAgICAgICJYLVZpcnVzLUNoZWNrZWQ6IENoZWNrZWQgYnkgQ2xhbUFWIG9uIGFwYWNoZS5vcmdcclxuIiArCisgICAgICAgICJYLU5vbnNwYW06IE5vbmVcclxuIiArCisgICAgICAgICJYLWZldGNoZWQtZnJvbTogbWFpbC54bWxtYXB0Lm9yZ1xyXG4iICsKKyAgICAgICAgIlgtRXZvbHV0aW9uLVNvdXJjZTogaW1hcDovL3JvYkB0aGViZXMvXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiLS09LXRJZEdZVnN0UUpnaHlFREFUbkorXHJcbiIgKworICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIgKworICAgICAgICAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdFxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIkxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcclxuIiArCisgICAgICAgICJvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcclxuIiArCisgICAgICAgICJkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxyXG4iICsKKyAgICAgICAgInJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcclxuIiArCisgICAgICAgICJ0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXHJcbiIgKworICAgICAgICAiXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXHJcbiIgKworICAgICAgICAid2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuIiArCisgICAgICAgICIgXHJcbiIgKworICAgICAgICAiVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLFxyXG4iICsKKyAgICAgICAgInNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuXHJcbiIgKworICAgICAgICAiXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuIiArCisgICAgICAgICJLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGVcclxuIiArCisgICAgICAgICJzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zXHJcbiIgKworICAgICAgICAidW5kZXIgdGhlIExpY2Vuc2UuXHJcbiIgKworICAgICAgICAiIFxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIi0tPS10SWRHWVZzdFFKZ2h5RURBVG5KK1xyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPWJsb2IucG5nO1xyXG4gICBtb2RpZmljYXRpb24tZGF0ZT1cIlN1biwgMjEgSnVuIDIwMDggMTU6MzI6MTggKzAwMDBcIjsgIiArCisgICAgICAgICJjcmVhdGlvbi1kYXRlPVwiU2F0LCAyMCBKdW4gMjAwOCAxMDoxNTowOSArMDAwMFwiOyByZWFkLWRhdGU9XCJNb24sIDIyIEp1biAyMDA4IDEyOjA4OjU2ICswMDAwXCI7c2l6ZT0xMDIzNDtcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IGltYWdlL3BuZzsgbmFtZT1ibG9iLnBuZ1xyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgImlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBb0FBQUFLQ0FJQUFBQUNVRmpxQUFBQUFYTlNSMElBcnM0YzZRQUFBQWx3U0ZsekFBQUxcclxuIiArCisgICAgICAgICJFd0FBQ3hNQkFKcWNHQUFBQUFkMFNVMUZCOWdGR1E0aUo5OXVmY1lBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvXHJcbiIgKworICAgICAgICAiSUVkSlRWQlhnUTRYQUFBQTBFbEVRVlFZMDJYTXdVckRRQmhGNFhzbmt5WWhqV0phQ2xvRU43Ny9hL2dFUlZ3SkxRaWlOalltYlRxWlxyXG4iICsKKyAgICAgICAgIi83cUlHL1ZzUHppTVR3KzIzV2ovb3ZaZE1RSmdWaUN2V05WdXNmYTIzZGp1VWYybnVnYm5JMlJ5bmtXRjVhMkZ3ZHZyczdxOXZocUVcclxuIiArCisgICAgICAgICJFMlFBRUlPNkJoWkJlclVmNmx1TXc0OU55VFIwT0x3NWtKRDlzcWs0SXB3YzZHQVJFdjVuNXBpWFRET1FmeTFKTVNzOFpnWEtxMmtGXHJcbiIgKworICAgICAgICAiaXdEZ0VyaUVlY25MbGVmRkVtR0FJdnFENGdnSkpOTU04NXFMdFhmWDl4WUd1RVErNC9rSWkwZzg4emxYZDY2KytRYVFERzVHUFp5cFxyXG4iICsKKyAgICAgICAgInJRQUFBQUJKUlU1RXJrSmdnZz09XHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiLS09LXRJZEdZVnN0UUpnaHlFREFUbkorXHJcbiIgKworICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9YmxvYi5wbmdcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IGltYWdlL3BuZzsgbmFtZT1ibG9iLnBuZ1xyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgImlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBb0FBQUFLQ0FJQUFBQUNVRmpxQUFBQUFYTlNSMElBcnM0YzZRQUFBQWx3U0ZsekFBQUxcclxuIiArCisgICAgICAgICJFd0FBQ3hNQkFKcWNHQUFBQUFkMFNVMUZCOWdGR1E0aUo5OXVmY1lBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvXHJcbiIgKworICAgICAgICAiSUVkSlRWQlhnUTRYQUFBQTBFbEVRVlFZMDJYTXdVckRRQmhGNFhzbmt5WWhqV0phQ2xvRU43Ny9hL2dFUlZ3SkxRaWlOalltYlRxWlxyXG4iICsKKyAgICAgICAgIi83cUlHL1ZzUHppTVR3KzIzV2ovb3ZaZE1RSmdWaUN2V05WdXNmYTIzZGp1VWYybnVnYm5JMlJ5bmtXRjVhMkZ3ZHZyczdxOXZocUVcclxuIiArCisgICAgICAgICJFMlFBRUlPNkJoWkJlclVmNmx1TXc0OU55VFIwT0x3NWtKRDlzcWs0SXB3YzZHQVJFdjVuNXBpWFRET1FmeTFKTVNzOFpnWEtxMmtGXHJcbiIgKworICAgICAgICAiaXdEZ0VyaUVlY25MbGVmRkVtR0FJdnFENGdnSkpOTU04NXFMdFhmWDl4WUd1RVErNC9rSWkwZzg4emxYZDY2KytRYVFERzVHUFp5cFxyXG4iICsKKyAgICAgICAgInJRQUFBQUJKUlU1RXJrSmdnZz09XHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiLS09LXRJZEdZVnN0UUpnaHlFREFUbkorXHJcbiIgKworICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9cmh1YmFyYi50eHRcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IG5hbWU9cmh1YmFyYi50eHQ7IGNoYXJzZXQ9dXMtYXNjaWlcclxuIiArCisgICAgICAgICJDb250ZW50LUxhbmd1YWdlOiBlbiwgZW4tVVMsIGVuLUNBXHJcbiIgKworICAgICAgICAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZVxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIlJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodT1cclxuIiArCisgICAgICAgICJiYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXI9XHJcbiIgKworICAgICAgICAiYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSPVxyXG4iICsKKyAgICAgICAgImh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1Yj1cclxuIiArCisgICAgICAgICJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmI9XHJcbiIgKworICAgICAgICAiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJoPVxyXG4iICsKKyAgICAgICAgInViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYT1cclxuIiArCisgICAgICAgICJyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiA9XHJcbiIgKworICAgICAgICAiUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1PVxyXG4iICsKKyAgICAgICAgImJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcj1cclxuIiArCisgICAgICAgICJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFI9XHJcbiIgKworICAgICAgICAiaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViPVxyXG4iICsKKyAgICAgICAgImFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYj1cclxuIiArCisgICAgICAgICIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmg9XHJcbiIgKworICAgICAgICAidWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhPVxyXG4iICsKKyAgICAgICAgInJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiID1cclxuIiArCisgICAgICAgICJSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHU9XHJcbiIgKworICAgICAgICAiYmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyPVxyXG4iICsKKyAgICAgICAgImIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUj1cclxuIiArCisgICAgICAgICJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWI9XHJcbiIgKworICAgICAgICAiYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiPVxyXG4iICsKKyAgICAgICAgIiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaD1cclxuIiArCisgICAgICAgICJ1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmE9XHJcbiIgKworICAgICAgICAicmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgPVxyXG4iICsKKyAgICAgICAgIlJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodT1cclxuIiArCisgICAgICAgICJiYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXI9XHJcbiIgKworICAgICAgICAiYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSPVxyXG4iICsKKyAgICAgICAgImh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1Yj1cclxuIiArCisgICAgICAgICJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmI9XHJcbiIgKworICAgICAgICAiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJoPVxyXG4iICsKKyAgICAgICAgInViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYT1cclxuIiArCisgICAgICAgICJyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiA9XHJcbiIgKworICAgICAgICAiUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1PVxyXG4iICsKKyAgICAgICAgImJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcj1cclxuIiArCisgICAgICAgICJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFI9XHJcbiIgKworICAgICAgICAiaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViPVxyXG4iICsKKyAgICAgICAgImFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYj1cclxuIiArCisgICAgICAgICIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmg9XHJcbiIgKworICAgICAgICAidWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhPVxyXG4iICsKKyAgICAgICAgInJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiID1cclxuIiArCisgICAgICAgICJSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYlxyXG4iICsKKyAgICAgICAgIlxyXG4iICsKKyAgICAgICAgIi0tPS10SWRHWVZzdFFKZ2h5RURBVG5KKy0tXHJcbiI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1BBUlRfTUlNRV9BU0NJSV9CT0RZID0gIkEgc2luZ2xlIHBhcnQgTUlNRSBtYWlsLlxyXG4iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkZDODIyX1NJTVBMRV9CT0RZID0gIlRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBlbWFpbC5cclxuIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfUEFSVF9NSU1FXzg4NTlfQk9EWSA9ICJNXHUwMEY2bmNoZW5nbGFkYmFjaFxyXG4iOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9QQVJUX01JTUVfQkFTRTY0X0xBVElOMV9CT0RZID0gIkhlbGxvIE1vXHUwMEY2bmNoZW5nbGFkYmFjaFxyXG4iOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9QQVJUX01JTUVfUVVPVEVEX1BSSU5UQUJMRV9BU0NJSV9CT0RZID0gIlNvbm5ldCBMWFhYSSBCeSBXaWxsaWFtIFNoYWtlc3BlYXJlXHJcbiIgKworICAgICAgICAgICAgIk9yIEkgc2hhbGwgbGl2ZSB5b3VyIGVwaXRhcGggdG8gbWFrZSxcclxuIiArCisgICAgICAgICAgICAiT3IgeW91IHN1cnZpdmUgd2hlbiBJIGluIGVhcnRoIGFtIHJvdHRlbjtcclxuIiArCisgICAgICAgICAgICAiRnJvbSBoZW5jZSB5b3VyIG1lbW9yeSBkZWF0aCBjYW5ub3QgdGFrZSxcclxuIiArCisgICAgICAgICAgICAiQWx0aG91Z2ggaW4gbWUgZWFjaCBwYXJ0IHdpbGwgYmUgZm9yZ290dGVuLlxyXG4iICsKKyAgICAgICAgICAgICJZb3VyIG5hbWUgZnJvbSBoZW5jZSBpbW1vcnRhbCBsaWZlIHNoYWxsIGhhdmUsXHJcbiIgKworICAgICAgICAgICAgIlRob3VnaCBJLCBvbmNlIGdvbmUsIHRvIGFsbCB0aGUgd29ybGQgbXVzdCBkaWU6XHJcbiIgKworICAgICAgICAgICAgIlRoZSBlYXJ0aCBjYW4geWllbGQgbWUgYnV0IGEgY29tbW9uIGdyYXZlLFxyXG4iICsKKyAgICAgICAgICAgICJXaGVuIHlvdSBlbnRvbWJlZCBpbiBtZW4ncyBleWVzIHNoYWxsIGxpZS5cclxuIiArCisgICAgICAgICAgICAiWW91ciBtb251bWVudCBzaGFsbCBiZSBteSBnZW50bGUgdmVyc2UsXHJcbiIgKworICAgICAgICAgICAgIldoaWNoIGV5ZXMgbm90IHlldCBjcmVhdGVkIHNoYWxsIG8nZXItcmVhZDtcclxuIiArCisgICAgICAgICAgICAiQW5kIHRvbmd1ZXMgdG8gYmUsIHlvdXIgYmVpbmcgc2hhbGwgcmVoZWFyc2UsXHJcbiIgKworICAgICAgICAgICAgIldoZW4gYWxsIHRoZSBicmVhdGhlcnMgb2YgdGhpcyB3b3JsZCBhcmUgZGVhZDtcclxuIiArCisgICAgICAgICAgICAiICBZb3Ugc3RpbGwgc2hhbGwgbGl2ZSwtLXN1Y2ggdmlydHVlIGhhdGggbXkgcGVuLC0tXHJcbiIgKworICAgICAgICAgICAgIiAgV2hlcmUgYnJlYXRoIG1vc3QgYnJlYXRoZXMsIGV2ZW4gaW4gdGhlIG1vdXRocyBvZiBtZW4uXHJcbiI7IAorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBPTkVfUEFSVF9NSU1FX0JBU0U2NF9MQVRJTjFfRU5DT0RFRCA9IEVuY29kZVV0aWxzLnRvQmFzZTY0KGxhdGluMShPTkVfUEFSVF9NSU1FX0JBU0U2NF9MQVRJTjFfQk9EWSkpOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9QQVJUX01JTUVfQkFTRTY0X0FTQ0lJX0JPRFkgPSAiSGVsbG8sIFdvcmxkIVxyXG4iOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9QQVJUX01JTUVfV0lUSF9DT05URU5UX0RJU1BPU0lUSU9OX1BBUkFNRVRFUlMgPQorICAgICAgICAiTWVzc2FnZS1JRDogPGY0NzBmNjhlMDgwMzA2MTAwMm4yMmJjNDEyNGhlMTQwMTVhNGI2ZDYzMjdmQG1haWwuZ21haWwuY29tPlxyXG4iICsKKyAgICAgICAgIkRhdGU6IFRodSwgNiBNYXIgMjAwOCAxODowMjowMyArMDAwMFxyXG4iICsKKyAgICAgICAgIkZyb206IFwiUm9iZXJ0IEJ1cnJlbGwgRG9ua2luXCIgPHJvYmVydGJ1cnJlbGxkb25raW5AZ21haWwuY29tPlxyXG4iICsKKyAgICAgICAgIlRvOiBcIkphbWVzIERldmVsb3BlcnMgTGlzdFwiIDxzZXJ2ZXItZGV2QGphbWVzLmFwYWNoZS5vcmc+XHJcbiIgKworICAgICAgICAiU3ViamVjdDogW01pbWU0Sl0gZ2V0UmVhZGVyXHJcbiIgKworICAgICAgICAiTUlNRS1WZXJzaW9uOiAxLjBcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArCisgICAgICAgICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0XHJcbiIgKworICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmb289YmFyOyBvbmU9MTsgcGFyYW09dmFsdWU7XHJcbiIgKworICAgICAgICAiQ29udGVudC1NRDU6ICIgKyBNRDVfQ09OVEVOVCArICJcclxuIiArCisgICAgICAgICJEZWxpdmVyZWQtVG86IHJvYmVydGJ1cnJlbGxkb25raW5AZ21haWwuY29tXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICBPTkVfUEFSVF9NSU1FX0FTQ0lJX0JPRFk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gT05FX1BBUlRfTUlNRV9CQVNFNjRfQVNDSUlfRU5DT0RFRCA9IEVuY29kZVV0aWxzLnRvQmFzZTY0KGFzY2lpKE9ORV9QQVJUX01JTUVfQkFTRTY0X0FTQ0lJX0JPRFkpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9QQVJUX01JTUVfQVNDSUkgPSAiUmVjZWl2ZWQ6IGJ5IDEwLjExNC4xMjYuMTYgd2l0aCBIVFRQOyBUaHUsIDYgTWFyIDIwMDggMTA6MDI6MDMgLTA4MDAgKFBTVClcclxuIiArCisgICAgIk1lc3NhZ2UtSUQ6IDxmNDcwZjY4ZTA4MDMwNjEwMDJuMjJiYzQxMjRoZTE0MDE1YTRiNmQ2MzI3ZkBtYWlsLmdtYWlsLmNvbT5cclxuIiArCisgICAgIkRhdGU6IFRodSwgNiBNYXIgMjAwOCAxODowMjowMyArMDAwMFxyXG4iICsKKyAgICAiRnJvbTogXCJSb2JlcnQgQnVycmVsbCBEb25raW5cIiA8cm9iZXJ0YnVycmVsbGRvbmtpbkBnbWFpbC5jb20+XHJcbiIgKworICAgICJUbzogXCJKYW1lcyBEZXZlbG9wZXJzIExpc3RcIiA8c2VydmVyLWRldkBqYW1lcy5hcGFjaGUub3JnPlxyXG4iICsKKyAgICAiU3ViamVjdDogW01pbWU0Sl0gZ2V0UmVhZGVyXHJcbiIgKworICAgICJNSU1FLVZlcnNpb246IDEuMFxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcbiIgKworICAgICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0XHJcbiIgKworICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmVcclxuIiArCisgICAgIkRlbGl2ZXJlZC1Ubzogcm9iZXJ0YnVycmVsbGRvbmtpbkBnbWFpbC5jb21cclxuIiArCisgICAgIlxyXG4iICsKKyAgICBPTkVfUEFSVF9NSU1FX0FTQ0lJX0JPRFk7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1BBUlRfTUlNRV9BU0NJSV9DT01NRU5UX0lOX01JTUVfVkVSU0lPTiA9ICJSZWNlaXZlZDogYnkgMTAuMTE0LjEyNi4xNiB3aXRoIEhUVFA7IFRodSwgNiBNYXIgMjAwOCAxMDowMjowMyAtMDgwMCAoUFNUKVxyXG4iICsKKyAgICAiTWVzc2FnZS1JRDogPGY0NzBmNjhlMDgwMzA2MTAwMm4yMmJjNDEyNGhlMTQwMTVhNGI2ZDYzMjdmQG1haWwuZ21haWwuY29tPlxyXG4iICsKKyAgICAiRGF0ZTogVGh1LCA2IE1hciAyMDA4IDE4OjAyOjAzICswMDAwXHJcbiIgKworICAgICJGcm9tOiBcIlJvYmVydCBCdXJyZWxsIERvbmtpblwiIDxyb2JlcnRidXJyZWxsZG9ua2luQGdtYWlsLmNvbT5cclxuIiArCisgICAgIlRvOiBcIkphbWVzIERldmVsb3BlcnMgTGlzdFwiIDxzZXJ2ZXItZGV2QGphbWVzLmFwYWNoZS5vcmc+XHJcbiIgKworICAgICJTdWJqZWN0OiBbTWltZTRKXSBnZXRSZWFkZXJcclxuIiArCisgICAgIk1JTUUtVmVyc2lvbjogMi4oVGhpcyBpcyBhIGNvbW1lbnQpNFxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcbiIgKworICAgICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0XHJcbiIgKworICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmVcclxuIiArCisgICAgIkRlbGl2ZXJlZC1Ubzogcm9iZXJ0YnVycmVsbGRvbmtpbkBnbWFpbC5jb21cclxuIiArCisgICAgIlxyXG4iICsgT05FX1BBUlRfTUlNRV9BU0NJSV9CT0RZOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9QQVJUX01JTUVfQVNDSUlfTUlNRV9WRVJTSU9OX1NQQU5TX1RXT19MSU5FUyA9ICJSZWNlaXZlZDogYnkgMTAuMTE0LjEyNi4xNiB3aXRoIEhUVFA7IFRodSwgNiBNYXIgMjAwOCAxMDowMjowMyAtMDgwMCAoUFNUKVxyXG4iICsKKyAgICAiTWVzc2FnZS1JRDogPGY0NzBmNjhlMDgwMzA2MTAwMm4yMmJjNDEyNGhlMTQwMTVhNGI2ZDYzMjdmQG1haWwuZ21haWwuY29tPlxyXG4iICsKKyAgICAiRGF0ZTogVGh1LCA2IE1hciAyMDA4IDE4OjAyOjAzICswMDAwXHJcbiIgKworICAgICJGcm9tOiBcIlJvYmVydCBCdXJyZWxsIERvbmtpblwiIDxyb2JlcnRidXJyZWxsZG9ua2luQGdtYWlsLmNvbT5cclxuIiArCisgICAgIlRvOiBcIkphbWVzIERldmVsb3BlcnMgTGlzdFwiIDxzZXJ2ZXItZGV2QGphbWVzLmFwYWNoZS5vcmc+XHJcbiIgKworICAgICJTdWJqZWN0OiBbTWltZTRKXSBnZXRSZWFkZXJcclxuIiArCisgICAgIk1JTUUtVmVyc2lvbjogNC4gICBcclxuIiArCisgICAgIiAgMVxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcbiIgKworICAgICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0XHJcbiIgKworICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmVcclxuIiArCisgICAgIkRlbGl2ZXJlZC1Ubzogcm9iZXJ0YnVycmVsbGRvbmtpbkBnbWFpbC5jb21cclxuIiArCisgICAgIlxyXG4iICsgT05FX1BBUlRfTUlNRV9BU0NJSV9CT0RZOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSX01BSUwgPSAiRnJvbTogVGltb3RoeSBUYXlsZXIgPHRpbUBleGFtcGxlLm9yZz5cclxuIiArCisgICAgIlRvOiBKb3NodWEgVGV0bGV5IDxqb3NodWFAZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICJEYXRlOiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpXHJcbiIgKworICAgICJTdWJqZWN0OiBNdWx0aXBhcnQgV2l0aG91dCBSRkM4MjIgUGFydFxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7Ym91bmRhcnk9NDJcclxuXHJcbiIgKworICAgICItLTQyXHJcbiIgKworICAgICJDb250ZW50LVR5cGU6dGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG5cclxuIiArCisgICAgIkZpcnN0IHBhcnQgb2YgdGhpcyBtYWlsXHJcbiIgKworICAgICItLTQyXHJcbiIgKworICAgICJDb250ZW50LVR5cGU6dGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG5cclxuIiArCisgICAgIlNlY29uZCBwYXJ0IG9mIHRoaXMgbWFpbFxyXG4iICsKKyAgICAiLS00Mi0tXHJcbiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlMX1dJVEhfUkZDODIyX1BBUlQgPSAiTUlNRS1WZXJzaW9uOiAxLjBcclxuIiArCisgICAgIkZyb206IFRpbW90aHkgVGF5bGVyIDx0aW1AZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICJUbzogSm9zaHVhIFRldGxleSA8am9zaHVhQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAiRGF0ZTogVHVlLCAxMiBGZWIgMjAwOCAxNzozNDowOSArMDAwMCAoR01UKVxyXG4iICsKKyAgICAiU3ViamVjdDogTXVsdGlwYXJ0IFdpdGggUkZDODIyIFBhcnRcclxuIiArCisgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PTE3MjlcclxuXHJcbiIgKworICAgICJBIHNob3J0IHByZW1hYmxlXHJcbiIgKworICAgICItLTE3MjlcclxuXHJcbiIgKworICAgICJGaXJzdCBwYXJ0IGhhcyBubyBoZWFkZXJzXHJcbiIgKworICAgICItLTE3MjlcclxuIiArCisgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG5cclxuIiArCisgICAgIlNlY29uZCBwYXJ0IGlzIHBsYWluIHRleHRcclxuIiArCisgICAgIi0tMTcyOVxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMlxyXG5cclxuIiArCisgICAgSU5ORVJfTUFJTCArCisgICAgIi0tMTcyOVxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcblxyXG4iICsKKyAgICAiTGFzdCBwYXJ0IGlzIHBsYWluIHRleHRcclxuIiArCisgICAgIi0tMTcyOS0tXHJcbiIgKworICAgICJUaGUgRW5kIjsKKyAgICAgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1BBUlRfTUlNRV84ODU5ID0gIlJlY2VpdmVkOiBieSAxMC4xMTQuMTI2LjE2IHdpdGggSFRUUDsgVGh1LCA2IE1hciAyMDA4IDEwOjAyOjAzIC0wODAwIChQU1QpXHJcbiIgKworICAgICJNZXNzYWdlLUlEOiA8ZjQ3MGY2OGUwODAzMDYxMDAybjIyYmM0MTI0aGUxNDAxNWE0YjZkNjMyN2ZAbWFpbC5nbWFpbC5jb20+XHJcbiIgKworICAgICJEYXRlOiBUaHUsIDYgTWFyIDIwMDggMTg6MDI6MDMgKzAwMDBcclxuIiArCisgICAgIkZyb206IFwiUm9iZXJ0IEJ1cnJlbGwgRG9ua2luXCIgPHJvYmVydGJ1cnJlbGxkb25raW5AZ21haWwuY29tPlxyXG4iICsKKyAgICAiVG86IFwiSmFtZXMgRGV2ZWxvcGVycyBMaXN0XCIgPHNlcnZlci1kZXZAamFtZXMuYXBhY2hlLm9yZz5cclxuIiArCisgICAgIlN1YmplY3Q6IFtNaW1lNEpdIGdldFJlYWRlclxyXG4iICsKKyAgICAiTUlNRS1WZXJzaW9uOiAxLjBcclxuIiArCisgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xXHJcbiIgKworICAgICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XHJcbiIgKworICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmVcclxuIiArCisgICAgIkNvbnRlbnQtSUQ6ICIgKyBDT05URU5UX0lEICsgIlxyXG4iICsKKyAgICAiQ29udGVudC1EZXNjcmlwdGlvbjogIiArIENPTlRFTlRfREVTQ1JJUFRJT04gKyAiXHJcbiIgKworICAgICJEZWxpdmVyZWQtVG86IHJvYmVydGJ1cnJlbGxkb25raW5AZ21haWwuY29tXHJcbiIgKworICAgICJcclxuIiArCisgICAgT05FX1BBUlRfTUlNRV84ODU5X0JPRFk7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1BBUlRfTUlNRV9CQVNFNjRfQVNDSUlfSEVBREVSUyA9ICJSZWNlaXZlZDogYnkgMTAuMTE0LjEyNi4xNiB3aXRoIEhUVFA7IFRodSwgNiBNYXIgMjAwOCAxMDowMjowMyAtMDgwMCAoUFNUKVxyXG4iICsKKyAgICAiTWVzc2FnZS1JRDogPGY0NzBmNjhlMDgwMzA2MTAwMm4yMmJjNDEyNGhlMTQwMTVhNGI2ZDYzMjdmQG1haWwuZ21haWwuY29tPlxyXG4iICsKKyAgICAiRGF0ZTogVGh1LCA2IE1hciAyMDA4IDE4OjAyOjAzICswMDAwXHJcbiIgKworICAgICJGcm9tOiBcIlJvYmVydCBCdXJyZWxsIERvbmtpblwiIDxyb2JlcnRidXJyZWxsZG9ua2luQGdtYWlsLmNvbT5cclxuIiArCisgICAgIlRvOiBcIkphbWVzIERldmVsb3BlcnMgTGlzdFwiIDxzZXJ2ZXItZGV2QGphbWVzLmFwYWNoZS5vcmc+XHJcbiIgKworICAgICJTdWJqZWN0OiBbTWltZTRKXSBnZXRSZWFkZXJcclxuIiArCisgICAgIk1JTUUtVmVyc2lvbjogMS4wXHJcbiIgKworICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArCisgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iICsKKyAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lXHJcbiIgKworICAgICJEZWxpdmVyZWQtVG86IHJvYmVydGJ1cnJlbGxkb25raW5AZ21haWwuY29tXHJcbiIgKworICAgICJcclxuIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfUEFSVF9NSU1FX0JBU0U2NF9MQVRJTjFfSEVBREVSUyA9ICJSZWNlaXZlZDogYnkgMTAuMTE0LjEyNi4xNiB3aXRoIEhUVFA7IFRodSwgNiBNYXIgMjAwOCAxMDowMjowMyAtMDgwMCAoUFNUKVxyXG4iICsKKyAgICAiTWVzc2FnZS1JRDogPGY0NzBmNjhlMDgwMzA2MTAwMm4yMmJjNDEyNGhlMTQwMTVhNGI2ZDYzMjdmQG1haWwuZ21haWwuY29tPlxyXG4iICsKKyAgICAiRGF0ZTogVGh1LCA2IE1hciAyMDA4IDE4OjAyOjAzICswMDAwXHJcbiIgKworICAgICJGcm9tOiBcIlJvYmVydCBCdXJyZWxsIERvbmtpblwiIDxyb2JlcnRidXJyZWxsZG9ua2luQGdtYWlsLmNvbT5cclxuIiArCisgICAgIlRvOiBcIkphbWVzIERldmVsb3BlcnMgTGlzdFwiIDxzZXJ2ZXItZGV2QGphbWVzLmFwYWNoZS5vcmc+XHJcbiIgKworICAgICJTdWJqZWN0OiBbTWltZTRKXSBnZXRSZWFkZXJcclxuIiArCisgICAgIk1JTUUtVmVyc2lvbjogMS4wXHJcbiIgKworICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMVxyXG4iICsKKyAgICAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0XHJcbiIgKworICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmVcclxuIiArCisgICAgIkRlbGl2ZXJlZC1Ubzogcm9iZXJ0YnVycmVsbGRvbmtpbkBnbWFpbC5jb21cclxuIiArCisgICAgIlxyXG4iOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9QQVJUX01JTUVfUVVPVEVEX1BSSU5UQUJMRV9BU0NJSSA9ICJSZWNlaXZlZDogYnkgMTAuMTE0LjEyNi4xNiB3aXRoIEhUVFA7IFRodSwgNiBNYXIgMjAwOCAxMDowMjowMyAtMDgwMCAoUFNUKVxyXG4iICsKKyAgICAiTWVzc2FnZS1JRDogPGY0NzBmNjhlMDgwMzA2MTAwMm4yMmJjNDEyNGhlMTQwMTVhNGI2ZDYzMjdmQG1haWwuZ21haWwuY29tPlxyXG4iICsKKyAgICAiRGF0ZTogVGh1LCA2IE1hciAyMDA4IDE4OjAyOjAzICswMDAwXHJcbiIgKworICAgICJGcm9tOiBcIlJvYmVydCBCdXJyZWxsIERvbmtpblwiIDxyb2JlcnRidXJyZWxsZG9ua2luQGdtYWlsLmNvbT5cclxuIiArCisgICAgIlRvOiBcIkphbWVzIERldmVsb3BlcnMgTGlzdFwiIDxzZXJ2ZXItZGV2QGphbWVzLmFwYWNoZS5vcmc+XHJcbiIgKworICAgICJTdWJqZWN0OiBbTWltZTRKXSBnZXRSZWFkZXJcclxuIiArCisgICAgIk1JTUUtVmVyc2lvbjogMS4wXHJcbiIgKworICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArCisgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1QcmludGFibGVcclxuIiArCisgICAgIkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZVxyXG4iICsKKyAgICAiRGVsaXZlcmVkLVRvOiByb2JlcnRidXJyZWxsZG9ua2luQGdtYWlsLmNvbVxyXG4iICsKKyAgICAiXHJcbiIgKyBicmVha0xpbmVzKE9ORV9QQVJUX01JTUVfUVVPVEVEX1BSSU5UQUJMRV9BU0NJSV9CT0RZLnJlcGxhY2VBbGwoIlxyXG4iLCAiPTBEPTBBIikpOworICAgIAorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJGQ19TSU1QTEUgPSAKKyAgICAgICAgICAgICJGcm9tOiBUaW1vdGh5IFRheWxlciA8dGltb3RoeUBleGFtcGxlLm9yZz5cclxuIiArCisgICAgICAgICAgICAiVG86IFNhbXVhbCBTbWl0aCA8c2FtdWFsQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICJEYXRlOiBUaHUsIDE0IEZlYiAyMDA4IDEyOjAwOjAwICswMDAwIChHTVQpXHJcbiIgKworICAgICAgICAgICAgIlN1YmplY3Q6IEEgU2ltcGxlIEVtYWlsXHJcbiIgKworICAgICAgICAgICAgIlxyXG4iICsKKyAgICAgICAgICAgIFJGQzgyMl9TSU1QTEVfQk9EWTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfUkZDODIyX1NJTVBMRSA9IAorICAgICAgICAiRnJvbTogU2FtdWFsIFNtaXRoIDxzYW1AZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICAgICAiVG86IEpvc2h1YSBUZXRsZXkgPGpvc2hAZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICAgICAiRGF0ZTogVGh1LCAxNCBGZWIgMjAwOCAxMjozMDowMCArMDAwMCAoR01UKVxyXG4iICsKKyAgICAgICAgIlN1YmplY3Q6IEZXOiBBIFNpbXBsZSBFbWFpbFxyXG4iICsKKyAgICAgICAgIk1JTUUtVmVyc2lvbjogMS4wXHJcbiIgKworICAgICAgICAiQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMlxyXG4iICsKKyAgICAgICAgIlxyXG4iICsgUkZDX1NJTVBMRTsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX01JWEVEX01VTFRJUEFSVF9WQVJJT1VTX0VOQ09ESU5HU183QklUID0gIlNvbm5ldCBYWFhJSUkgQnkgV2lsbGlhbSBTaGFrZXNwZWFyZVxyXG4iICsKKyAgICAgICAgICAgICJcclxuIiArCisgICAgICAgICAgICAiRnVsbCBtYW55IGEgZ2xvcmlvdXMgbW9ybmluZyBoYXZlIEkgc2VlblxyXG4iICsKKyAgICAgICAgICAgICJGbGF0dGVyIHRoZSBtb3VudGFpbiB0b3BzIHdpdGggc292ZXJlaWduIGV5ZSxcclxuIiArCisgICAgICAgICAgICAiS2lzc2luZyB3aXRoIGdvbGRlbiBmYWNlIHRoZSBtZWFkb3dzIGdyZWVuLFxyXG4iICsKKyAgICAgICAgICAgICJHaWxkaW5nIHBhbGUgc3RyZWFtcyB3aXRoIGhlYXZlbmx5IGFsY2hlbXk7XHJcbiIgKworICAgICAgICAgICAgIkFub24gcGVybWl0IHRoZSBiYXNlc3QgY2xvdWRzIHRvIHJpZGVcclxuIiArCisgICAgICAgICAgICAiV2l0aCB1Z2x5IHJhY2sgb24gaGlzIGNlbGVzdGlhbCBmYWNlLFxyXG4iICsKKyAgICAgICAgICAgICJBbmQgZnJvbSB0aGUgZm9ybG9ybiB3b3JsZCBoaXMgdmlzYWdlIGhpZGUsXHJcbiIgKworICAgICAgICAgICAgIlN0ZWFsaW5nIHVuc2VlbiB0byB3ZXN0IHdpdGggdGhpcyBkaXNncmFjZTpcclxuIiArCisgICAgICAgICAgICAiRXZlbiBzbyBteSBzdW4gb25lIGVhcmx5IG1vcm4gZGlkIHNoaW5lLFxyXG4iICsKKyAgICAgICAgICAgICJXaXRoIGFsbCB0cml1bXBoYW50IHNwbGVuZG91ciBvbiBteSBicm93O1xyXG4iICsKKyAgICAgICAgICAgICJCdXQgb3V0ISBhbGFjayEgaGUgd2FzIGJ1dCBvbmUgaG91ciBtaW5lLFxyXG4iICsKKyAgICAgICAgICAgICJUaGUgcmVnaW9uIGNsb3VkIGhhdGggbWFzaydkIGhpbSBmcm9tIG1lIG5vdy5cclxuIiArCisgICAgICAgICAgICAiICBZZXQgaGltIGZvciB0aGlzIG15IGxvdmUgbm8gd2hpdCBkaXNkYWluZXRoO1xyXG4iICsKKyAgICAgICAgICAgICIgIFN1bnMgb2YgdGhlIHdvcmxkIG1heSBzdGFpbiB3aGVuIGhlYXZlbidzIHN1biBzdGFpbmV0aC5cclxuIjsKKyAgICAgICAgICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX1FVT1RFRF9QUklOVEFCTEUgPSAiU29ubmV0IFhYWFYgQnkgV2lsbGlhbSBTaGFrZXNwZWFyZVxyXG4iICsKKyAgICAgICAgICAgICJcclxuIiArCisgICAgICAgICAgICAiTm8gbW9yZSBiZSBncmlldidkIGF0IHRoYXQgd2hpY2ggdGhvdSBoYXN0IGRvbmU6XHJcbiIgKworICAgICAgICAgICAgIlJvc2VzIGhhdmUgdGhvcm5zLCBhbmQgc2lsdmVyIGZvdW50YWlucyBtdWQ6XHJcbiIgKworICAgICAgICAgICAgIkNsb3VkcyBhbmQgZWNsaXBzZXMgc3RhaW4gYm90aCBtb29uIGFuZCBzdW4sXHJcbiIgKworICAgICAgICAgICAgIkFuZCBsb2F0aHNvbWUgY2Fua2VyIGxpdmVzIGluIHN3ZWV0ZXN0IGJ1ZC5cclxuIiArCisgICAgICAgICAgICAiQWxsIG1lbiBtYWtlIGZhdWx0cywgYW5kIGV2ZW4gSSBpbiB0aGlzLFxyXG4iICsKKyAgICAgICAgICAgICJBdXRob3JpemluZyB0aHkgdHJlc3Bhc3Mgd2l0aCBjb21wYXJlLFxyXG4iICsKKyAgICAgICAgICAgICJNeXNlbGYgY29ycnVwdGluZywgc2FsdmluZyB0aHkgYW1pc3MsXHJcbiIgKworICAgICAgICAgICAgIkV4Y3VzaW5nIHRoeSBzaW5zIG1vcmUgdGhhbiB0aHkgc2lucyBhcmU7XHJcbiIgKworICAgICAgICAgICAgIkZvciB0byB0aHkgc2Vuc3VhbCBmYXVsdCBJIGJyaW5nIGluIHNlbnNlLC0tXHJcbiIgKworICAgICAgICAgICAgIlRoeSBhZHZlcnNlIHBhcnR5IGlzIHRoeSBhZHZvY2F0ZSwtLVxyXG4iICsKKyAgICAgICAgICAgICJBbmQgJ2dhaW5zdCBteXNlbGYgYSBsYXdmdWwgcGxlYSBjb21tZW5jZTpcclxuIiArCisgICAgICAgICAgICAiU3VjaCBjaXZpbCB3YXIgaXMgaW4gbXkgbG92ZSBhbmQgaGF0ZSxcclxuIiArCisgICAgICAgICAgICAiICBUaGF0IEkgYW4gYWNjZXNzYXJ5IG5lZWRzIG11c3QgYmUsXHJcbiIgKworICAgICAgICAgICAgIiAgVG8gdGhhdCBzd2VldCB0aGllZiB3aGljaCBzb3VybHkgcm9icyBmcm9tIG1lLlxyXG4iOyAKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX01JWEVEX01VTFRJUEFSVF9WQVJJT1VTX0VOQ09ESU5HU19CQVNFNjQgPSAiU29ubmV0IFhYWFZJSUkgQnkgV2lsbGlhbSBTaGFrZXNwZWFyZVxyXG4iICsKKyAgICAgICAgICAgICJcclxuIiArCisgICAgICAgICAgICAiSG93IGNhbiBteSBtdXNlIHdhbnQgc3ViamVjdCB0byBpbnZlbnQsXHJcbiIgKworICAgICAgICAgICAgIldoaWxlIHRob3UgZG9zdCBicmVhdGhlLCB0aGF0IHBvdXInc3QgaW50byBteSB2ZXJzZVxyXG4iICsKKyAgICAgICAgICAgICJUaGluZSBvd24gc3dlZXQgYXJndW1lbnQsIHRvbyBleGNlbGxlbnRcclxuIiArCisgICAgICAgICAgICAiRm9yIGV2ZXJ5IHZ1bGdhciBwYXBlciB0byByZWhlYXJzZT9cclxuIiArCisgICAgICAgICAgICAiTyEgZ2l2ZSB0aHkgc2VsZiB0aGUgdGhhbmtzLCBpZiBhdWdodCBpbiBtZVxyXG4iICsKKyAgICAgICAgICAgICJXb3J0aHkgcGVydXNhbCBzdGFuZCBhZ2FpbnN0IHRoeSBzaWdodDtcclxuIiArCisgICAgICAgICAgICAiRm9yIHdobydzIHNvIGR1bWIgdGhhdCBjYW5ub3Qgd3JpdGUgdG8gdGhlZSxcclxuIiArCisgICAgICAgICAgICAiV2hlbiB0aG91IHRoeSBzZWxmIGRvc3QgZ2l2ZSBpbnZlbnRpb24gbGlnaHQ/XHJcbiIgKworICAgICAgICAgICAgIkJlIHRob3UgdGhlIHRlbnRoIE11c2UsIHRlbiB0aW1lcyBtb3JlIGluIHdvcnRoXHJcbiIgKworICAgICAgICAgICAgIlRoYW4gdGhvc2Ugb2xkIG5pbmUgd2hpY2ggcmh5bWVycyBpbnZvY2F0ZTtcclxuIiArCisgICAgICAgICAgICAiQW5kIGhlIHRoYXQgY2FsbHMgb24gdGhlZSwgbGV0IGhpbSBicmluZyBmb3J0aFxyXG4iICsKKyAgICAgICAgICAgICJFdGVybmFsIG51bWJlcnMgdG8gb3V0bGl2ZSBsb25nIGRhdGUuXHJcbiIgKworICAgICAgICAgICAgIiAgSWYgbXkgc2xpZ2h0IG11c2UgZG8gcGxlYXNlIHRoZXNlIGN1cmlvdXMgZGF5cyxcclxuIiArCisgICAgICAgICAgICAiICBUaGUgcGFpbiBiZSBtaW5lLCBidXQgdGhpbmUgc2hhbGwgYmUgdGhlIHByYWlzZS5cclxuIjsKKyAgICAgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9NSVhFRF9NVUxUSVBBUlRfVkFSSU9VU19FTkNPRElOR1NfT05FID0gCisgICAgICAgICAgICAiRnJvbTogVGltb3RoeSBUYXlsZXIgPHRpbW90aHlAZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICAgICAgICAgIlRvOiBTYW11YWwgU21pdGggPHNhbXVhbEBleGFtcGxlLm9yZz5cclxuIiArCisgICAgICAgICAgICAiRGF0ZTogVGh1LCAxNCBGZWIgMjAwOCAxMjowMDowMCArMDAwMCAoR01UKVxyXG4iICsKKyAgICAgICAgICAgICJTdWJqZWN0OiBBIE11bHRpcGFydCBFbWFpbFxyXG4iICsKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDtib3VuZGFyeT0xNzI5XHJcbiIgKworICAgICAgICAgICAgIlxyXG4iICsKKyAgICAgICAgICAgICJTdGFydCB3aXRoIGEgcHJlYW1ibGVcclxuIiArCisgICAgICAgICAgICAiXHJcbiIgKworICAgICAgICAgICAgIi0tMTcyOVxyXG4iICsKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArCisgICAgICAgICAgICAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdFxyXG5cclxuIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU1FX01JWEVEX01VTFRJUEFSVF9WQVJJT1VTX0VOQ09ESU5HU19UV08gPSAKKyAgICAgICAgICAgICJcclxuLS0xNzI5XHJcbiIgKworICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG4iICsKKyAgICAgICAgICAgICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBRdW90ZWQtUHJpbnRhYmxlXHJcblxyXG4iOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX1RIUkVFID0gCisgICAgICAgICAgICAiXHJcbi0tMTcyOVxyXG4iICsKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArCisgICAgICAgICAgICAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0XHJcblxyXG4iOworICAgICAgICAgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9NSVhFRF9NVUxUSVBBUlRfVkFSSU9VU19FTkNPRElOR1NfRU5EID0gCisgICAgICAgICAgICAiXHJcbi0tMTcyOS0tXHJcbiI7CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlNRV9NVUxUSVBBUlRfQUxURVJOQVRJVkUgPSAKKyAgICAgICAgIkZyb206IFRpbW90aHkgVGF5bGVyIDx0aW1vdGh5QGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAgICAgIlRvOiBTYW11YWwgU21pdGggPHNhbXVhbEBleGFtcGxlLm9yZz5cclxuIiArCisgICAgICAgICJEYXRlOiBUaHUsIDE0IEZlYiAyMDA4IDEyOjAwOjAwICswMDAwIChHTVQpXHJcbiIgKworICAgICAgICAiU3ViamVjdDogQSBNdWx0aXBhcnQgRW1haWxcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTtib3VuZGFyeT0xNzI5XHJcblxyXG4iICsKKyAgICAgICAgIlN0YXJ0IHdpdGggYSBwcmVhbWJsZVxyXG4iICsKKyAgICAgICAgIlxyXG4tLTE3MjlcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3hodG1sK3htbFxyXG5cclxuIiArCisgICAgICAgICI8IURPQ1RZUEUgaHRtbFxyXG4iICsKKyAgICAgICAgIlBVQkxJQyBcIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOXCJcclxuIiArCisgICAgICAgICJcImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGRcIj5cclxuIiArCisgICAgICAgICI8aHRtbD48aGVhZD48dGl0bGU+Umh1YmFyYjwvdGl0bGU+PC9oZWFkPjxib2R5PlJodWJhcmIhPC9ib2R5PjwvaHRtbD5cclxuIiArCisgICAgICAgICJcclxuLS0xNzI5XHJcbiIgKworICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcblxyXG4iICsKKyAgICAgICAgIlJodWJhcmIhXHJcbiIgKworICAgICAgICAiXHJcbi0tMTcyOVxyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PVVTLUFTQ0lJXHJcblxyXG4iICsKKyAgICAgICAgIjxodG1sPjxoZWFkPjx0aXRsZT5SaHViYXJiPC90aXRsZT48L2hlYWQ+PGJvZHk+Umh1YmFyYiE8L2JvZHk+PC9odG1sPlxyXG4iICsKKyAgICAgICAgIlxyXG4tLTE3MjktLVxyXG4iICsKKyAgICAgICAgIlRoaXMgaXMgdGhlIGVwaWxvZ3VlXHJcbiI7CisgICAgCisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdW10gTUlNRV9NSVhFRF9NVUxUSVBBUlRfVkFSSU9VU19FTkNPRElOR1NfQllURV9BUlJBWVMgPSB7CisgICAgICAgIGFzY2lpKE1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX09ORSksCisgICAgICAgIGFzY2lpKE1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTXzdCSVQpLAorICAgICAgICBhc2NpaShNSU1FX01JWEVEX01VTFRJUEFSVF9WQVJJT1VTX0VOQ09ESU5HU19UV08pLAorICAgICAgICBhc2NpaShicmVha0xpbmVzKE1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX1FVT1RFRF9QUklOVEFCTEUucmVwbGFjZUFsbCgiXHJcbiIsICI9MEQ9MEEiKSkpLAorICAgICAgICBhc2NpaShNSU1FX01JWEVEX01VTFRJUEFSVF9WQVJJT1VTX0VOQ09ESU5HU19USFJFRSksCisgICAgICAgIEVuY29kZVV0aWxzLnRvQmFzZTY0KGFzY2lpKE1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX0JBU0U2NCkpLAorICAgICAgICBhc2NpaShNSU1FX01JWEVEX01VTFRJUEFSVF9WQVJJT1VTX0VOQ09ESU5HU19FTkQpLAorICAgIH07CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gTUlNRV9SRkM4MjJfU0lNUExFX0JZVEVTID0gYXNjaWkoTUlNRV9SRkM4MjJfU0lNUExFKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBNVUxUSVBBUlRfV0lUSF9DT05URU5UX0xPQ0FUSU9OX0JZVEVTID0gYXNjaWkoTVVMVElQQVJUX1dJVEhfQ09OVEVOVF9MT0NBVElPTik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gT05FX1BBUlRfTUlNRV9XSVRIX0NPTlRFTlRfRElTUE9TSVRJT05fUEFSQU1FVEVSU19CWVRFUyA9IGFzY2lpKE9ORV9QQVJUX01JTUVfV0lUSF9DT05URU5UX0RJU1BPU0lUSU9OX1BBUkFNRVRFUlMpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIE1JTUVfTVVMVElQQVJUX0FMVEVSTkFUSVZFX0JZVEVTID0gYXNjaWkoTUlNRV9NVUxUSVBBUlRfQUxURVJOQVRJVkUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIE1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX0JZVEVTID0gam9pbihNSU1FX01JWEVEX01VTFRJUEFSVF9WQVJJT1VTX0VOQ09ESU5HU19CWVRFX0FSUkFZUyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gT05FX1BBUlRfTUlNRV9RVU9URURfUFJJTlRBQkxFX0FTQ0lJX0JZVEVTID0gYXNjaWkoT05FX1BBUlRfTUlNRV9RVU9URURfUFJJTlRBQkxFX0FTQ0lJKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBPTkVfUEFSVF9NSU1FX0JBU0U2NF9MQVRJTjFfVVBQRVJDQVNFX0JZVEVTID0gam9pbihhc2NpaShPTkVfUEFSVF9NSU1FX0JBU0U2NF9MQVRJTjFfSEVBREVSUy50b1VwcGVyQ2FzZShMb2NhbGUuVUspKSwgT05FX1BBUlRfTUlNRV9CQVNFNjRfTEFUSU4xX0VOQ09ERUQpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIE9ORV9QQVJUX01JTUVfQkFTRTY0X0xBVElOMV9CWVRFUyA9IGpvaW4oYXNjaWkoT05FX1BBUlRfTUlNRV9CQVNFNjRfTEFUSU4xX0hFQURFUlMpLCBPTkVfUEFSVF9NSU1FX0JBU0U2NF9MQVRJTjFfRU5DT0RFRCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gT05FX1BBUlRfTUlNRV9CQVNFNjRfQVNDSUlfQllURVMgPSBqb2luKGFzY2lpKE9ORV9QQVJUX01JTUVfQkFTRTY0X0FTQ0lJX0hFQURFUlMpLCBPTkVfUEFSVF9NSU1FX0JBU0U2NF9BU0NJSV9FTkNPREVEKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBSRkM4MjJfU0lNUExFX0JZVEVTID0gVVNfQVNDSUkuZW5jb2RlKFJGQ19TSU1QTEUpLmFycmF5KCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gT05FX1BBUlRfTUlNRV9BU0NJSV9CWVRFUyA9IFVTX0FTQ0lJLmVuY29kZShPTkVfUEFSVF9NSU1FX0FTQ0lJKS5hcnJheSgpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIE9ORV9QQVJUX01JTUVfODg1OV9CWVRFUyA9IExBVElOMS5lbmNvZGUoT05FX1BBUlRfTUlNRV84ODU5KS5hcnJheSgpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIE1VTFRJUEFSVF9XSVRIX0JJTkFSWV9BVFRBQ0hNRU5UU19CWVRFUyA9IFVTX0FTQ0lJLmVuY29kZShNVUxUSVBBUlRfV0lUSF9CSU5BUllfQVRUQUNITUVOVFMpLmFycmF5KCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gT05FX1BBUlRfTUlNRV9BU0NJSV9DT01NRU5UX0lOX01JTUVfVkVSU0lPTl9CWVRFUyA9IFVTX0FTQ0lJLmVuY29kZShPTkVfUEFSVF9NSU1FX0FTQ0lJX0NPTU1FTlRfSU5fTUlNRV9WRVJTSU9OKS5hcnJheSgpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIE9ORV9QQVJUX01JTUVfQVNDSUlfTUlNRV9WRVJTSU9OX1NQQU5TX1RXT19MSU5FU19CWVRFUyA9IFVTX0FTQ0lJLmVuY29kZShPTkVfUEFSVF9NSU1FX0FTQ0lJX01JTUVfVkVSU0lPTl9TUEFOU19UV09fTElORVMpLmFycmF5KCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gTUFJTF9XSVRIX1JGQzgyMl9QQVJUX0JZVEVTID0gYXNjaWkoTUFJTF9XSVRIX1JGQzgyMl9QQVJUKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBNSU1FX01VTFRJUEFSVF9FTUJFRERFRF9NRVNTQUdFU19CWVRFUyA9IGFzY2lpKE1JTUVfTVVMVElQQVJUX0VNQkVEREVEX01FU1NBR0VTKTsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBhc2NpaShTdHJpbmcgdGV4dCkgeworICAgICAgICAKKyAgICAgICAgcmV0dXJuIFVTX0FTQ0lJLmVuY29kZSh0ZXh0KS5hcnJheSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBsYXRpbjEoU3RyaW5nIHRleHQpIHsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBMQVRJTjEuZW5jb2RlKHRleHQpLmFycmF5KCk7CisgICAgfQorICAgICAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBqb2luKGJ5dGVbXSBvbmUsIGJ5dGVbXSB0d28pIHsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdHMgPSBuZXcgYnl0ZVtvbmUubGVuZ3RoICsgdHdvLmxlbmd0aF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob25lLCAwLCByZXN1bHRzLCAwLCBvbmUubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0d28sIDAsIHJlc3VsdHMsIG9uZS5sZW5ndGgsIHR3by5sZW5ndGgpOworICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gam9pbihieXRlW11bXSBieXRlQXJyYXlzKSB7CisgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICBmb3IgKGJ5dGVbXSBieXRlcyA6IGJ5dGVBcnJheXMpIHsKKyAgICAgICAgICAgIGxlbmd0aCArPSBieXRlcy5sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIHJlc3VsdHMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGJ5dGVbXSBieXRlcyA6IGJ5dGVBcnJheXMpIHsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIHJlc3VsdHMsIGNvdW50LCBieXRlcy5sZW5ndGgpOworICAgICAgICAgICAgY291bnQgKz0gYnl0ZXMubGVuZ3RoOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHRzOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBicmVha0xpbmVzKFN0cmluZyBvcmlnaW5hbCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKG9yaWdpbmFsKTsKKyAgICAgICAgaW50IGNvdW50ID0gNzY7CisgICAgICAgIHdoaWxlKGNvdW50IDwgYnVmZmVyLmxlbmd0aCgpKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyLmNoYXJBdChjb3VudCkgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCAtIDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5jaGFyQXQoY291bnQtMSkgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCAtIDQ7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfSBlbHNlIGlmIChidWZmZXIuY2hhckF0KGNvdW50LTIpID09ICc9JykgeworICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgLSAzOworICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgIGJ1ZmZlci5pbnNlcnQoY291bnQsICdcbicpOworICAgICAgICAgICAgYnVmZmVyLmluc2VydChjb3VudCwgJ1xyJyk7CisgICAgICAgICAgICBidWZmZXIuaW5zZXJ0KGNvdW50LCAnPScpOworICAgICAgICAgICAgY291bnQgKz0gNzk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovVGVzdFV0aWwuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovVGVzdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjkxNmIwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9UZXN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQoraW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOw0KKw0KK3B1YmxpYyBjbGFzcyBUZXN0VXRpbCB7DQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVEVTVF9NRVNTQUdFUyA9IG5ldyBTdHJpbmdbXSB7DQorICAgICAgICAgICAgIjIwMDJfMDZfMTJfZG91YmxlYm91bmQiLA0KKyAgICAgICAgICAgICJhay0wNjk2IiwNCisgICAgICAgICAgICAiYmx1ZWRvdC1wb3N0Y2FyZCIsDQorICAgICAgICAgICAgImJsdWVkb3Qtc2ltcGxlIiwNCisgICAgICAgICAgICAiZG91YmxlLWJvdW5kLXdpdGgtZW1iZWRkZWQiLA0KKyAgICAgICAgICAgICJkb3VibGUtYm91bmQiLA0KKyAgICAgICAgICAgICJkdXAtbmFtZXMiLA0KKyAgICAgICAgICAgICJmcmFnIiwNCisgICAgICAgICAgICAiZ2VybWFuIiwNCisgICAgICAgICAgICAiaGRyLWZha2VvdXQiLA0KKyAgICAgICAgICAgICJtdWx0aS0yZXZpbCIsDQorICAgICAgICAgICAgIm11bHRpLTJnaWZzIiwNCisgICAgICAgICAgICAibXVsdGktY2xlbiIsDQorICAgICAgICAgICAgIm11bHRpLWRpZ2VzdCIsDQorICAgICAgICAgICAgIm11bHRpLWZyYWciLA0KKyAgICAgICAgICAgICJtdWx0aS1pZ29yIiwNCisgICAgICAgICAgICAibXVsdGktaWdvcjIiLA0KKyAgICAgICAgICAgICJtdWx0aS1uZXN0ZWQiLA0KKyAgICAgICAgICAgICJtdWx0aS1uZXN0ZWQyIiwNCisgICAgICAgICAgICAibXVsdGktbmVzdGVkMyIsDQorICAgICAgICAgICAgIm11bHRpLXNpbXBsZSIsDQorICAgICAgICAgICAgIm11bHRpLXdlaXJkc3BhY2UiLA0KKyAgICAgICAgICAgICJyZS1md2QiLA0KKyAgICAgICAgICAgICJydXNzaWFuIiwNCisgICAgICAgICAgICAic2ltcGxlIiwNCisgICAgICAgICAgICAidXUtanVuay10YXJnZXQiLA0KKyAgICAgICAgICAgICJ1dS1qdW5rIiwNCisgICAgICAgICAgICAidXUtemVlZ2VlIg0KKyAgICB9Ow0KKyAgICANCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZFJlc291cmNlKFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGNoYXJzZXQpIA0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICANCisgICAgICAgIHJldHVybiBJT1V0aWxzLnRvU3RyaW5nKHJlYWRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlKSwgY2hhcnNldCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSByZWFkUmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgcmVzb3VyY2UpIA0KKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorDQorICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oDQorICAgICAgICAgICAgICAgIFRlc3RVdGlsLmNsYXNzLmdldFJlc291cmNlKHJlc291cmNlKS5vcGVuU3RyZWFtKCkpOw0KKyAgICB9DQorICAgIA0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0Jhc2U2NElucHV0U3RyZWFtVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9CYXNlNjRJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmMxZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9CYXNlNjRJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDI5MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWM7DQorDQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247DQoraW1wb3J0IGphdmEudXRpbC5SYW5kb207DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQuTnVsbE91dHB1dFN0cmVhbTsNCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KK3B1YmxpYyBjbGFzcyBCYXNlNjRJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCisgICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLnJlc2V0Q29uZmlndXJhdGlvbigpOw0KKyAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbnVsbDsNCisgICAgICAgIEJhc2U2NElucHV0U3RyZWFtIGRlY29kZXIgPSBudWxsOw0KKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbnVsbDsNCisgICAgICAgIA0KKyAgICAgICAgLyoNCisgICAgICAgICAqIFNpbXBsZSBpbml0aWFsIHRlc3QuDQorICAgICAgICAgKi8NCisgICAgICAgIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgNCisgICAgICAgICAgICAgICAgZnJvbVN0cmluZygiVkdocGN5QnBjeUIwYUdVZ2NHeGhhVzRnZEdWNGRDQnRaWE56WVdkbElRPT0iKSk7DQorICAgICAgICBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSEiLCB0b1N0cmluZyhyZWFkKGRlY29kZXIpKSk7DQorICAgICAgICANCisgICAgICAgIC8qDQorICAgICAgICAgKiBUZXN0IGVuY29kZWQgdGV4dCBwYWRkZWQgb25jZSwgdHdpY2UgYW5kIG5vdCBhdCBhbGwuDQorICAgICAgICAgKi8NCisgICAgICAgIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgNCisgICAgICAgICAgICAgICAgZnJvbVN0cmluZygiVkdocGN5QnBjeUJoSUhSbGVIUWdkMmhwWTJnZ2FHRnpJSFJ2SUdKbCINCisgICAgICAgICAgICAgICAgICAgICAgICArICJJSEJoWkdSbFpDQnZibU5sTGk0PSIpKTsNCisgICAgICAgIGRlY29kZXIgPSBuZXcgQmFzZTY0SW5wdXRTdHJlYW0oYmlzKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBpcyBhIHRleHQgd2hpY2ggaGFzIHRvIGJlIHBhZGRlZCBvbmNlLi4iLCB0b1N0cmluZyhyZWFkKGRlY29kZXIpKSk7DQorICAgICAgICBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oDQorICAgICAgICAgICAgICAgIGZyb21TdHJpbmcoIlZHaHBjeUJwY3lCaElIUmxlSFFnZDJocFkyZ2dhR0Z6SUhSdklHSmwiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiSUhCaFpHUmxaQ0IwZDJsalpRPT0iKSk7DQorICAgICAgICBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgYSB0ZXh0IHdoaWNoIGhhcyB0byBiZSBwYWRkZWQgdHdpY2UiLCB0b1N0cmluZyhyZWFkKGRlY29kZXIpKSk7DQorICAgICAgICBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oDQorICAgICAgICAgICAgICAgIGZyb21TdHJpbmcoIlZHaHBjeUJwY3lCaElIUmxlSFFnZDJocFkyZ2dkMmxzYkNCdWIzUWciDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiWW1VZ2NHRmtaR1ZrIikpOw0KKyAgICAgICAgZGVjb2RlciA9IG5ldyBCYXNlNjRJbnB1dFN0cmVhbShiaXMpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIGEgdGV4dCB3aGljaCB3aWxsIG5vdCBiZSBwYWRkZWQiLCB0b1N0cmluZyhyZWFkKGRlY29kZXIpKSk7DQorICAgICAgICANCisgICAgICAgIC8qDQorICAgICAgICAgKiBUZXN0IHRoYXQgbm9uIGJhc2U2NCBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkLg0KKyAgICAgICAgICovDQorICAgICAgICBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oDQorICAgICAgICAgICAgICAgIGZyb21TdHJpbmcoIiAmJSBWR2hwXHJcbmN5QnBcclxuY3lCMGFHVWdjR3hoYVc0ZyAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFx0ZEdWNGRDQnRaPyFYTnpZKldkbElRPT0iKSk7DQorICAgICAgICBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSEiLCB0b1N0cmluZyhyZWFkKGRlY29kZXIpKSk7DQorICAgICAgICANCisgICAgICAgIC8qDQorICAgICAgICAgKiBUZXN0IHRoYXQgdGhlIGJ5dGVzIDAtMjU1IHNoaWZ0ZWQgMCwgMSBhbmQgMiBwb3NpdGlvbnMgYXJlDQorICAgICAgICAgKiBkZWNvZGVkIHByb3Blcmx5Lg0KKyAgICAgICAgICovDQorICAgICAgICBTdHJpbmcgczEgPSAiQUFFQ0F3UUZCZ2NJQ1FvTERBME9EeEFSRWhNVUZSWVhHQmthR3h3ZEhoOGdJU0lqSkNVIg0KKyAgICAgICAgICAgICAgICAgICsgIm1KeWdwS2lzc0xTNHZNREV5TXpRMU5qYzRPVG83UEQwK1AwQkJRa05FUlVaSFNFbEtTMCINCisgICAgICAgICAgICAgICAgICArICJ4TlRrOVFVVkpUVkZWV1YxaFpXbHRjWFY1ZllHRmlZMlJsWm1kb2FXcHJiRzF1YjNCeGMiDQorICAgICAgICAgICAgICAgICAgKyAibk4wZFhaM2VIbDZlM3g5Zm4rQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZIg0KKyAgICAgICAgICAgICAgICAgICsgIm1acWJuSjJlbjZDaG9xT2twYWFucUttcXE2eXRycSt3c2JLenRMVzJ0N2k1dXJ1OHZiNiINCisgICAgICAgICAgICAgICAgICArICIvd01IQ3c4VEZ4c2ZJeWNyTHpNM096OURSMHRQVTFkYlgyTm5hMjl6ZDN0L2c0ZUxqNU8iDQorICAgICAgICAgICAgICAgICAgKyAiWG01K2pwNnV2czdlN3Y4UEh5OC9UMTl2ZjQrZnI3L1AzKy93PT0iOw0KKyAgICAgICAgDQorICAgICAgICBTdHJpbmcgczIgPSAiQVFJREJBVUdCd2dKQ2dzTURRNFBFQkVTRXhRVkZoY1lHUm9iSEIwZUh5QWhJaU1rSlNZIg0KKyAgICAgICAgICAgICAgICAgICsgIm5LQ2txS3l3dExpOHdNVEl6TkRVMk56ZzVPanM4UFQ0L1FFRkNRMFJGUmtkSVNVcExURSINCisgICAgICAgICAgICAgICAgICArICIxT1QxQlJVbE5VVlZaWFdGbGFXMXhkWGw5Z1lXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMiDQorICAgICAgICAgICAgICAgICAgKyAiM1IxZG5kNGVYcDdmSDErZjRDQmdvT0VoWWFIaUltS2k0eU5qbytRa1pLVGxKV1dsNWlaIg0KKyAgICAgICAgICAgICAgICAgICsgIm1wdWNuWjZmb0tHaW82U2xwcWVvcWFxcnJLMnVyN0N4c3JPMHRiYTN1TG02dTd5OXZyLyINCisgICAgICAgICAgICAgICAgICArICJBd2NMRHhNWEd4OGpKeXN2TXpjN1AwTkhTMDlUVjF0ZlkyZHJiM04zZTMrRGg0dVBrNWUiDQorICAgICAgICAgICAgICAgICAgKyAiYm42T25xNit6dDd1L3c4Zkx6OVBYMjkvajUrdnY4L2Y3L0FBPT0iOw0KKyAgICAgICAgDQorICAgICAgICBTdHJpbmcgczMgPSAiQWdNRUJRWUhDQWtLQ3d3TkRnOFFFUklURkJVV0Z4Z1pHaHNjSFI0ZklDRWlJeVFsSmljIg0KKyAgICAgICAgICAgICAgICAgICsgIm9LU29yTEMwdUx6QXhNak0wTlRZM09EazZPenc5UGo5QVFVSkRSRVZHUjBoSlNrdE1UVSINCisgICAgICAgICAgICAgICAgICArICI1UFVGRlNVMVJWVmxkWVdWcGJYRjFlWDJCaFltTmtaV1puYUdscWEyeHRibTl3Y1hKemQiDQorICAgICAgICAgICAgICAgICAgKyAiSFYyZDNoNWVudDhmWDUvZ0lHQ2c0U0Zob2VJaVlxTGpJMk9qNUNSa3BPVWxaYVhtSm1hIg0KKyAgICAgICAgICAgICAgICAgICsgIm01eWRucCtnb2FLanBLV21wNmlwcXF1c3JhNnZzTEd5czdTMXRyZTR1YnE3dkwyK3Y4RCINCisgICAgICAgICAgICAgICAgICArICJCd3NQRXhjYkh5TW5LeTh6TnpzL1EwZExUMU5YVzE5aloydHZjM2Q3ZjRPSGk0K1RsNXUiDQorICAgICAgICAgICAgICAgICAgKyAiZm82ZXJyN08zdTcvRHg4dlAwOWZiMytQbjYrL3o5L3Y4QUFRPT0iOw0KKyAgICAgICAgDQorICAgICAgICBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZnJvbVN0cmluZyhzMSkpOw0KKyAgICAgICAgZGVjb2RlciA9IG5ldyBCYXNlNjRJbnB1dFN0cmVhbShiaXMpOw0KKyAgICAgICAgYnl0ZXMgPSByZWFkKGRlY29kZXIpOw0KKyAgICAgICAgDQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQb3NpdGlvbiAiICsgaSwgYnl0ZXNbaV0sIChieXRlKSBpKTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZyb21TdHJpbmcoczIpKTsNCisgICAgICAgIGRlY29kZXIgPSBuZXcgQmFzZTY0SW5wdXRTdHJlYW0oYmlzKTsNCisgICAgICAgIGJ5dGVzID0gcmVhZChkZWNvZGVyKTsNCisgICAgICAgIA0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUG9zaXRpb24gIiArIGksIGJ5dGVzW2ldLCAoYnl0ZSkgKGkgKyAxKSk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgICAgIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmcm9tU3RyaW5nKHMzKSk7DQorICAgICAgICBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBieXRlcyA9IHJlYWQoZGVjb2Rlcik7DQorICAgICAgICANCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlBvc2l0aW9uICIgKyBpLCBieXRlc1tpXSwgKGJ5dGUpIChpICsgMikpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVQcmVtYXR1cmVDbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBudWxsOw0KKyAgICAgICAgQmFzZTY0SW5wdXRTdHJlYW0gZGVjb2RlciA9IG51bGw7DQorICAgICAgICANCisgICAgICAgIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgNCisgICAgICAgICAgICAgICAgZnJvbVN0cmluZygiVkdocGN5QnBjeUIwYUdVZ2NHeGhhVzRnZEdWNGRDQnRaWE56WVdkbElRPT0iKSk7DQorICAgICAgICBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoJ1QnLCBkZWNvZGVyLnJlYWQoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoJ2gnLCBkZWNvZGVyLnJlYWQoKSk7DQorICAgICAgICBkZWNvZGVyLmNsb3NlKCk7DQorICAgICAgICANCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgZGVjb2Rlci5yZWFkKCk7DQorICAgICAgICAgICAgZmFpbCgpOw0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhwZWN0ZWQpIHsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um91bmR0cmlwV2l0aFZhcmlvdXNCdWZmZXJTaXplcygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVszNzE5XTsNCisgICAgICAgIG5ldyBSYW5kb20oMCkubmV4dEJ5dGVzKGRhdGEpOw0KKw0KKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgICAgICBDb2RlY1V0aWwuZW5jb2RlQmFzZTY0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwgZU91dCk7DQorICAgICAgICBieXRlW10gZW5jb2RlZCA9IGVPdXQudG9CeXRlQXJyYXkoKTsNCisNCisgICAgICAgIGZvciAoaW50IGJ1ZmZlclNpemUgPSAxOyBidWZmZXJTaXplIDw9IDEwMDk7IGJ1ZmZlclNpemUrKykgew0KKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShlbmNvZGVkKTsNCisgICAgICAgICAgICBCYXNlNjRJbnB1dFN0cmVhbSBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorDQorICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemVdOw0KKyAgICAgICAgICAgIGludCBpbnB1dExlbmd0aDsNCisgICAgICAgICAgICB3aGlsZSAoLTEgIT0gKGlucHV0TGVuZ3RoID0gZGVjb2Rlci5yZWFkKGJ1ZmZlcikpKSB7DQorICAgICAgICAgICAgICAgIGRPdXQud3JpdGUoYnVmZmVyLCAwLCBpbnB1dExlbmd0aCk7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGJ5dGVbXSBkZWNvZGVkID0gZE91dC50b0J5dGVBcnJheSgpOw0KKw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgZGVjb2RlZC5sZW5ndGgpOw0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgew0KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGF0YVtpXSwgZGVjb2RlZFtpXSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBUZXN0cyB7QGxpbmsgSW5wdXRTdHJlYW0jcmVhZCgpfQ0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgNCisgICAgICAgICAgICAgICAgZnJvbVN0cmluZygiVkdocGN5QnBjeUIwYUdVZ2NHeGhhVzRnZEdWNGRDQnRaWE56WVdkbElRPT0iKSk7DQorICAgICAgICBCYXNlNjRJbnB1dFN0cmVhbSBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKw0KKyAgICAgICAgd2hpbGUgKHRydWUpIHsNCisgICAgICAgICAgICBpbnQgeCA9IGRlY29kZXIucmVhZCgpOw0KKyAgICAgICAgICAgIGlmICh4ID09IC0xKQ0KKyAgICAgICAgICAgICAgICBicmVhazsNCisgICAgICAgICAgICBvdXQud3JpdGUoeCk7DQorICAgICAgICB9DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSEiLCB0b1N0cmluZyhvdXQNCisgICAgICAgICAgICAgICAgLnRvQnl0ZUFycmF5KCkpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogVGVzdHMge0BsaW5rIElucHV0U3RyZWFtI3JlYWQoYnl0ZVtdLCBpbnQsIGludCl9IHdpdGggdmFyaW91cyBvZmZzZXRzDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE9mZnNldCgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKA0KKyAgICAgICAgICAgICAgICBmcm9tU3RyaW5nKCJWR2hwY3lCcGN5QjBhR1VnY0d4aGFXNGdkR1Y0ZENCdFpYTnpZV2RsSVE9PSIpKTsNCisgICAgICAgIEJhc2U2NElucHV0U3RyZWFtIGRlY29kZXIgPSBuZXcgQmFzZTY0SW5wdXRTdHJlYW0oYmlzKTsNCisNCisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMzZdOw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7Oykgew0KKyAgICAgICAgICAgIGludCBieXRlcyA9IGRlY29kZXIucmVhZChkYXRhLCBpLCA1KTsNCisgICAgICAgICAgICBpZiAoYnl0ZXMgPT0gLTEpDQorICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgIGkgKz0gYnl0ZXM7DQorICAgICAgICB9DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSFcMFwwXDBcMFwwIiwNCisgICAgICAgICAgICAgICAgdG9TdHJpbmcoZGF0YSkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpY3RVbmV4cGVjdGVkRW9mKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oDQorICAgICAgICAgICAgICAgIGZyb21TdHJpbmcoIlZHaHBjeUJwY3lCMGFHVWdjR3hoYVc0Z2RHVjRkQ0J0WlhOellXZGxJIikpOw0KKyAgICAgICAgQmFzZTY0SW5wdXRTdHJlYW0gZGVjb2RlciA9IG5ldyBCYXNlNjRJbnB1dFN0cmVhbShiaXMsIHRydWUpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBDb2RlY1V0aWwuY29weShkZWNvZGVyLCBuZXcgTnVsbE91dHB1dFN0cmVhbSgpKTsNCisgICAgICAgICAgICBmYWlsKCk7DQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgew0KKyAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLnRvTG93ZXJDYXNlKCkuY29udGFpbnMoDQorICAgICAgICAgICAgICAgICAgICAiZW5kIG9mIGZpbGUiKSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdExlbmllbnRVbmV4cGVjdGVkRW9mKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oDQorICAgICAgICAgICAgICAgIGZyb21TdHJpbmcoIlZHaHBjeUJwY3lCMGFHVWdjR3hoYVc0Z2RHVjRkQ0J0WlhOellXZGxJIikpOw0KKyAgICAgICAgQmFzZTY0SW5wdXRTdHJlYW0gZGVjb2RlciA9IG5ldyBCYXNlNjRJbnB1dFN0cmVhbShiaXMsIGZhbHNlKTsNCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgICAgICBDb2RlY1V0aWwuY29weShkZWNvZGVyLCBvdXQpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIHRoZSBwbGFpbiB0ZXh0IG1lc3NhZ2UiLCB0b1N0cmluZyhvdXQNCisgICAgICAgICAgICAgICAgLnRvQnl0ZUFycmF5KCkpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaWN0VW5leHBlY3RlZFBhZCgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKA0KKyAgICAgICAgICAgICAgICBmcm9tU3RyaW5nKCJWR2hwY3lCcGN5QjBhR1VnY0d4aGFXNGdkR1Y0ZENCdFpYTnpZV2RsST0iKSk7DQorICAgICAgICBCYXNlNjRJbnB1dFN0cmVhbSBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcywgdHJ1ZSk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIENvZGVjVXRpbC5jb3B5KGRlY29kZXIsIG5ldyBOdWxsT3V0cHV0U3RyZWFtKCkpOw0KKyAgICAgICAgICAgIGZhaWwoKTsNCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7DQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZC5nZXRNZXNzYWdlKCkudG9Mb3dlckNhc2UoKS5jb250YWlucygicGFkIikpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50VW5leHBlY3RlZFBhZCgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKA0KKyAgICAgICAgICAgICAgICBmcm9tU3RyaW5nKCJWR2hwY3lCcGN5QjBhR1VnY0d4aGFXNGdkR1Y0ZENCdFpYTnpZV2RsST0iKSk7DQorICAgICAgICBCYXNlNjRJbnB1dFN0cmVhbSBkZWNvZGVyID0gbmV3IEJhc2U2NElucHV0U3RyZWFtKGJpcywgZmFsc2UpOw0KKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgIENvZGVjVXRpbC5jb3B5KGRlY29kZXIsIG91dCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSIsIHRvU3RyaW5nKG91dA0KKyAgICAgICAgICAgICAgICAudG9CeXRlQXJyYXkoKSkpOw0KKyAgICB9DQorICAgICAgICANCisgICAgcHJpdmF0ZSBieXRlW10gcmVhZChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7DQorICAgICAgICBpbnQgYjsNCisgICAgICAgIHdoaWxlICgoYiA9IGlzLnJlYWQoKSkgIT0gLTEpIHsNCisgICAgICAgICAgICBib3Mud3JpdGUoYik7DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gYm9zLnRvQnl0ZUFycmF5KCk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgYnl0ZVtdIGZyb21TdHJpbmcoU3RyaW5nIHMpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7DQorICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmcoYnl0ZVtdIGIpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYiwgIlVTLUFTQ0lJIik7DQorICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0Jhc2U2NE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvQmFzZTY0T3V0cHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODcwYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0Jhc2U2NE91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYzsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQmFzZTY0T3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbnVsbDsKKyAgICAgICAgQmFzZTY0T3V0cHV0U3RyZWFtIGVuY29kZXIgPSBudWxsOworICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogU2ltcGxlIGluaXRpYWwgdGVzdC4KKyAgICAgICAgICovCisgICAgICAgIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgZW5jb2RlciA9IG5ldyBCYXNlNjRPdXRwdXRTdHJlYW0oYm9zKTsKKyAgICAgICAgZW5jb2Rlci53cml0ZShmcm9tU3RyaW5nKCJUaGlzIGlzIHRoZSBwbGFpbiB0ZXh0IG1lc3NhZ2UhIikpOworICAgICAgICBlbmNvZGVyLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVkdocGN5QnBjeUIwYUdVZ2NHeGhhVzRnZEdWNGRDQnRaWE56WVdkbElRPT1cclxuIiwgdG9TdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlVW5kZXJseWluZ1N0cmVhbVN0YXlzT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBudWxsOworICAgICAgICBCYXNlNjRPdXRwdXRTdHJlYW0gZW5jb2RlciA9IG51bGw7CisgICAgICAgIAorICAgICAgICBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGVuY29kZXIgPSBuZXcgQmFzZTY0T3V0cHV0U3RyZWFtKGJvcyk7CisgICAgICAgIGVuY29kZXIud3JpdGUoZnJvbVN0cmluZygiVGhpcyBpcyB0aGUgcGxhaW4gdGV4dCBtZXNzYWdlISIpKTsKKyAgICAgICAgZW5jb2Rlci5jbG9zZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbmNvZGVyLndyaXRlKCdiJyk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvcy53cml0ZSgneScpOworICAgICAgICBib3Mud3JpdGUoJ2EnKTsKKyAgICAgICAgYm9zLndyaXRlKCdkJyk7CisgICAgICAgIGJvcy53cml0ZSgnYScpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlZHaHBjeUJwY3lCMGFHVWdjR3hoYVc0Z2RHVjRkQ0J0WlhOellXZGxJUT09XHJcbnlhZGEiLCB0b1N0cmluZyhib3MudG9CeXRlQXJyYXkoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3ROb0xpbmVTZXBhcmF0b3JzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBlbmNvZGVOb0xzKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWVE9PSIsIGVuY29kZU5vTHMoImEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWVdJPSIsIGVuY29kZU5vTHMoImFiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmoiLCBlbmNvZGVOb0xzKCJhYmMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWVdKalpBPT0iLCBlbmNvZGVOb0xzKCJhYmNkIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaR1U9IiwgZW5jb2RlTm9McygiYWJjZGUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWVdKalpHVm0iLCBlbmNvZGVOb0xzKCJhYmNkZWYiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWVdKalpHVm1adz09IiwgZW5jb2RlTm9McygiYWJjZGVmZyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZV0pqWkdWbVoyZz0iLCBlbmNvZGVOb0xzKCJhYmNkZWZnaCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZV0pqWkdWbVoyaHAiLCBlbmNvZGVOb0xzKCJhYmNkZWZnaGkiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRFFvTUNRPT0iLCBlbmNvZGVOb0xzKCJcclxuXGZcdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMVDAvVkdoaGRDZHpJR0VnZEdWemREODlMUT09IiwKKyAgICAgICAgICAgICAgICBlbmNvZGVOb0xzKCItPT9UaGF0J3MgYSB0ZXN0Pz0tIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lU2VwYXJhdG9ycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZW5jb2RlTHMoIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZUT09XHJcbiIsIGVuY29kZUxzKCJhIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaQT09XHJcbiIsIGVuY29kZUxzKCJhYmNkIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaR1ZtWnc9PVxyXG4iLCBlbmNvZGVMcygiYWJjZGVmZyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZV0pqWkdWbVoyZz1cclxuIiwgZW5jb2RlTHMoImFiY2RlZmdoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaR1ZtWjJocFxyXG4iLCBlbmNvZGVMcygiYWJjZGVmZ2hpIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaR1ZtWjJocFxyXG5hZz09XHJcbiIsIGVuY29kZUxzKCJhYmNkZWZnaGlqIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaR1ZtWjJocFxyXG5hbXM9XHJcbiIsIGVuY29kZUxzKCJhYmNkZWZnaGlqayIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZV0pqWkdWbVoyaHBcclxuYW10c1xyXG4iLCBlbmNvZGVMcygiYWJjZGVmZ2hpamtsIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3RzIHtAbGluayBPdXRwdXRTdHJlYW0jd3JpdGUoaW50KX0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBmcm9tU3RyaW5nKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIiCisgICAgICAgICAgICAgICAgKyAiMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKKyAgICAgICAgICAgICAgICArICIxMjM0NTY3ODkwMTIzNDUiKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQmFzZTY0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCYXNlNjRPdXRwdXRTdHJlYW0oYik7CisKKyAgICAgICAgZm9yIChieXRlIGVsZW1lbnQgOiBieXRlcykKKyAgICAgICAgICAgIG91dC53cml0ZShlbGVtZW50KTsKKworICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICBTdHJpbmcgYWN0dWFsID0gbmV3IFN0cmluZyhiLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJNVEl6TkRVMk56ZzVNREV5TXpRMU5qYzRPVEF4TWpNME5UWTNPRGt3TVRJek5EVTJOeiIKKyAgICAgICAgICAgICAgICArICJnNU1ERXlNelExTmpjNE9UQXhNak0wTlRZM1xyXG5PRGt3TVRJek5EVTJOemc1TURFeU16UTFOamM0IgorICAgICAgICAgICAgICAgICsgIk9UQXhNak0wTlRZM09Ea3dNVEl6TkRVMk56ZzVNREV5TXpRMU5qYzRPVEF4TWpNMFxyXG5OUT09XHIiCisgICAgICAgICAgICAgICAgKyAiXG4iOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0cyB7QGxpbmsgT3V0cHV0U3RyZWFtI3dyaXRlKGJ5dGVbXSwgaW50LCBpbnQpfSB3aXRoIHZhcmlvdXMgb2Zmc2V0cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZU9mZnNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IGZyb21TdHJpbmcoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMiIKKyAgICAgICAgICAgICAgICArICIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIgorICAgICAgICAgICAgICAgICsgIjEyMzQ1Njc4OTAxMjM0NSIpOworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBCYXNlNjRPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJhc2U2NE91dHB1dFN0cmVhbShiKTsKKworICAgICAgICBmb3IgKGludCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBieXRlcy5sZW5ndGg7IG9mZnNldCArPSAyKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gTWF0aC5taW4oMiwgYnl0ZXMubGVuZ3RoIC0gb2Zmc2V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZShieXRlcywgb2Zmc2V0LCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgU3RyaW5nIGFjdHVhbCA9IG5ldyBTdHJpbmcoYi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiTVRJek5EVTJOemc1TURFeU16UTFOamM0T1RBeE1qTTBOVFkzT0Rrd01USXpORFUyTnoiCisgICAgICAgICAgICAgICAgKyAiZzVNREV5TXpRMU5qYzRPVEF4TWpNME5UWTNcclxuT0Rrd01USXpORFUyTnpnNU1ERXlNelExTmpjNCIKKyAgICAgICAgICAgICAgICArICJPVEF4TWpNME5UWTNPRGt3TVRJek5EVTJOemc1TURFeU16UTFOamM0T1RBeE1qTTBcclxuTlE9PVxyIgorICAgICAgICAgICAgICAgICsgIlxuIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogdGVzdHMge0BsaW5rIE91dHB1dFN0cmVhbSNmbHVzaCgpfSB3aGlsZSB3cml0aW5nCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlRmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBmcm9tU3RyaW5nKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIiCisgICAgICAgICAgICAgICAgKyAiMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKKyAgICAgICAgICAgICAgICArICIxMjM0NTY3ODkwMTIzNDUiKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQmFzZTY0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCYXNlNjRPdXRwdXRTdHJlYW0oYik7CisKKyAgICAgICAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgYnl0ZXMubGVuZ3RoOyBvZmZzZXQgKz0gNykgeworICAgICAgICAgICAgaW50IGxlbiA9IE1hdGgubWluKDcsIGJ5dGVzLmxlbmd0aCAtIG9mZnNldCk7CisgICAgICAgICAgICBvdXQud3JpdGUoYnl0ZXMsIG9mZnNldCwgbGVuKTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgU3RyaW5nIGFjdHVhbCA9IG5ldyBTdHJpbmcoYi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiTVRJek5EVTJOemc1TURFeU16UTFOamM0T1RBeE1qTTBOVFkzT0Rrd01USXpORFUyTnoiCisgICAgICAgICAgICAgICAgKyAiZzVNREV5TXpRMU5qYzRPVEF4TWpNME5UWTNcclxuT0Rrd01USXpORFUyTnpnNU1ERXlNelExTmpjNCIKKyAgICAgICAgICAgICAgICArICJPVEF4TWpNME5UWTNPRGt3TVRJek5EVTJOemc1TURFeU16UTFOamM0T1RBeE1qTTBcclxuTlE9PVxyIgorICAgICAgICAgICAgICAgICsgIlxuIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlTm9McyhTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZW5jb2RlKHN0ciwgMCwgbmV3IGJ5dGVbXSB7fSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlTHMoU3RyaW5nIHN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZShzdHIsIDEyLCBuZXcgYnl0ZVtdIHsgJ1xyJywgJ1xuJyB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGUoU3RyaW5nIHN0ciwgaW50IGxpbmVMZW5ndGgsIGJ5dGVbXSBsaW5lU2VwYXJhdG9yKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gZnJvbVN0cmluZyhzdHIpOworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBCYXNlNjRPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJhc2U2NE91dHB1dFN0cmVhbShiLCBsaW5lTGVuZ3RoLAorICAgICAgICAgICAgICAgIGxpbmVTZXBhcmF0b3IpOworCisgICAgICAgIG91dC53cml0ZShieXRlcyk7CisgICAgICAgIG91dC5jbG9zZSgpOworCisgICAgICAgIHJldHVybiB0b1N0cmluZyhiLnRvQnl0ZUFycmF5KCkpOworICAgIH0KKyAgICAgICAgCisgICAgcHJpdmF0ZSBieXRlW10gZnJvbVN0cmluZyhTdHJpbmcgcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyB0b1N0cmluZyhieXRlW10gYikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYiwgIlVTLUFTQ0lJIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvQ29kZWNVdGlsVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9Db2RlY1V0aWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkNDNiNQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvQ29kZWNVdGlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouRXhhbXBsZU1haWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIENvZGVjVXRpbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBFeGFtcGxlTWFpbC5NVUxUSVBBUlRfV0lUSF9CSU5BUllfQVRUQUNITUVOVFNfQllURVM7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBDb2RlY1V0aWwuY29weShpbiwgb3V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRlbnQsIG91dC50b0J5dGVBcnJheSgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVF1b3RlZFByaW50YWJsZUxhcmdlSW5wdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNCAqIDU7IGkrKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSAoJzAnICsgKGkgJSAxMCkpKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBzYi50b1N0cmluZygpLnJlcGxhY2VBbGwoIihcXGR7NzV9KSIsICIkMT1cclxuIik7CisgICAgICAgIAorICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYi50b1N0cmluZygpLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ29kZWNVdGlsLmVuY29kZVF1b3RlZFByaW50YWJsZUJpbmFyeShpbiwgb3V0KTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbCA9IG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVF1b3RlZFByaW50YWJsZU5vbkFzY2lpQ2hhcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSAiN2JpdCBjb250ZW50IHdpdGggZXVybyBcdTIwQUMgc3ltYm9sIjsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygiaXNvLTg4NTktMTUiKSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVjVXRpbC5lbmNvZGVRdW90ZWRQcmludGFibGVCaW5hcnkoaW4sIG91dCk7CisgICAgICAgIFN0cmluZyBhY3R1YWwgPSBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI3Yml0PTIwY29udGVudD0yMHdpdGg9MjBldXJvPTIwPUE0PTIwc3ltYm9sIiwgYWN0dWFsKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2U2NE91dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjA0OCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiMDEyMzQ1Njc4OUFCQ0RFRiIpOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBpbnB1dCA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBvdXRwdXQgPSByb3VuZHRyaXBVc2luZ091dHB1dFN0cmVhbShpbnB1dCk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbnB1dCwgb3V0cHV0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyByb3VuZHRyaXBVc2luZ091dHB1dFN0cmVhbShTdHJpbmcgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBCYXNlNjRPdXRwdXRTdHJlYW0gb3V0YjY0ID0gbmV3IEJhc2U2NE91dHB1dFN0cmVhbShvdXQyLCA3Nik7CisgICAgICAgIENvZGVjVXRpbC5jb3B5KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygpKSwgb3V0YjY0KTsKKyAgICAgICAgb3V0YjY0LmZsdXNoKCk7CisgICAgICAgIG91dGI2NC5jbG9zZSgpOworICAgICAgICAKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQmFzZTY0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dDIudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0Um91bmR0cmlwID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBDb2RlY1V0aWwuY29weShpcywgb3V0Um91bmR0cmlwKTsKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IG5ldyBTdHJpbmcob3V0Um91bmR0cmlwLnRvQnl0ZUFycmF5KCkpOworICAgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaXMgYSBwcm9vZiBmb3IgTUlNRTRKLTY3CisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2U2NEVuY29kZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwNDgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjAxMjM0NTY3ODlBQkNERUYiKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgaW5wdXQgPSBzYi50b1N0cmluZygpOworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcm91bmR0cmlwVXNpbmdFbmNvZGVyKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0LCBvdXRwdXQpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJvdW5kdHJpcFVzaW5nRW5jb2RlcihTdHJpbmcgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVjVXRpbC5lbmNvZGVCYXNlNjQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpLCBvdXQpOworICAgICAgICAKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgQmFzZTY0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRSb3VuZHRyaXAgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVjVXRpbC5jb3B5KGlzLCBvdXRSb3VuZHRyaXApOworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gbmV3IFN0cmluZyhvdXRSb3VuZHRyaXAudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfSAKKyAgICAKKyAgICAvKiBwZXJmb3JtYW5jZSB0ZXN0LCBub3QgYSB1bml0IHRlc3QgKi8KKyAgICAvKgorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtYW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBpZiAodHJ1ZSkgcmV0dXJuOworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsxMDAwMF07CisgICAgICAgIFJhbmRvbSByID0gbmV3IFJhbmRvbSg0MzI4NzU2MjM4NzRMKTsKKyAgICAgICAgci5uZXh0Qnl0ZXMoYnl0ZXMpOworICAgICAgICBsb25nIHRvdGFsRW5jb2RlcjEgPSAwOworICAgICAgICBsb25nIHRvdGFsU3RyZWFtMSA9IDA7CisgICAgICAgIGxvbmcgdG90YWxFbmNvZGVyMiA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHIubmV4dEludCgxMDAwKTsKKyAgICAgICAgICAgIGludCBwb3MgPSByLm5leHRJbnQoOTAwMCk7CisgICAgICAgICAgICBTdHJpbmcgaW5wdXQgPSBuZXcgU3RyaW5nKGJ5dGVzLCBwb3MsIGxlbmd0aCk7CisgICAgICAgICAgICBsb25nIHRpbWUxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgICAgICByb3VuZHRyaXBVc2luZ0VuY29kZXIoaW5wdXQpOworICAgICAgICAgICAgbG9uZyB0aW1lMiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgcm91bmR0cmlwVXNpbmdPdXRwdXRTdHJlYW0oaW5wdXQpOworICAgICAgICAgICAgbG9uZyB0aW1lMyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICAgICAgcm91bmR0cmlwVXNpbmdFbmNvZGVyKGlucHV0KTsKKyAgICAgICAgICAgIGxvbmcgdGltZTQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdG90YWxFbmNvZGVyMSArPSB0aW1lMi10aW1lMTsKKyAgICAgICAgICAgIHRvdGFsU3RyZWFtMSArPSB0aW1lMy10aW1lMjsKKyAgICAgICAgICAgIHRvdGFsRW5jb2RlcjIgKz0gdGltZTQtdGltZTM7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5jb2RlciAxc3Q6ICIrdG90YWxFbmNvZGVyMSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW5jb2RlciAybmQ6ICIrdG90YWxFbmNvZGVyMik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyZWFtIDFzdDogIit0b3RhbFN0cmVhbTEpOworICAgIH0KKyAgICAqLworICAgIAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHMoYnl0ZVtdIGV4cGVjdGVkLCBieXRlW10gYWN0dWFsKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoZXhwZWN0ZWQubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgYWN0dWFsLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChjaGFyKWFjdHVhbFtpXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1pc21hdGNoQCIgKyBpLCBleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvRGVjb2RlclV0aWxUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0RlY29kZXJVdGlsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzQwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0RlY29kZXJVdGlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYzsNCisNCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7DQorDQorcHVibGljIGNsYXNzIERlY29kZXJVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgew0KKyAgICAgICAgQmFzaWNDb25maWd1cmF0b3IucmVzZXRDb25maWd1cmF0aW9uKCk7DQorICAgICAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsNCisgICAgfQ0KKyAgICAvKg0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlRW5jb2RlZFdvcmRzKCkgew0KKyAgICAgICAgU3RyaW5nIHMgPSAiPT9JU08tMjAyMi1KUD9CP0d5UkNUQ1FiS0VvYkpFSStOUnNvU2hza1FrSjZHeWhLR3lSQ09TMGJLRW89Pz0gIg0KKyAgICAgICAgICAgICAgICAgKyAiPT9JU08tMjAyMi1KUD9CP0d5UkNPWEFiS0VvYkpFSWlLQnNvU2hza1FpVTFHeWhLR3lSQ0pTUWJLRW89Pz0gIg0KKyAgICAgICAgICAgICAgICAgKyAiPT9JU08tMjAyMi1KUD9CP0d5UkNKVWtiS0VvYkpFSWxVeHNvU2hza1FpVTRHeWhLR3lSQ0pVMGJLRW89Pz0gIiAgDQorICAgICAgICAgICAgICAgICArICI9P0lTTy0yMDIyLUpQP0I/R3lSQ0pUa2JLRW9iSkVJa1Roc29TaHNrUWpkb0d5aEtHeVJDUkdvYktFbz0/PSAiDQorICAgICAgICAgICAgICAgICArICI9P0lTTy0yMDIyLUpQP0I/R3lSQ1NFY2JLRW9iSkVJa1J4c29TaHNrUWlRNUd5aEtHeVJDSVNvYktFbz0/PSI7ICAgICAgDQorICAgICAgICANCisgICAgICAgIHMgPSBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMocyk7DQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocyk7DQorICAgIH0qLw0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZUIoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgcyA9IERlY29kZXJVdGlsLmRlY29kZUIoIlZHaHBjeUJwY3lCMGFHVWdjR3hoYVc0Z2QiDQorICAgICAgICAgICAgICAgICAgICArICJHVjRkQ0J0WlhOellXZGxJUT09IiwgIklTTzg4NTktMSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIHRoZSBwbGFpbiB0ZXh0IG1lc3NhZ2UhIiwgcyk7DQorICAgIH0NCisgICAgDQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVRKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIHMgPSBEZWNvZGVyVXRpbC5kZWNvZGVRKCI9ZTFfPWUyPTA5PUUzXz1FNF8iLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVNPODg1OS0xIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDBlMSBcdTAwZTJcdFx1MDBlMyBcdTAwZTQgIiwgcyk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVFbmNvZGVkV29yZHMoKSB7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZYWRhIHlhZGEiLCBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMoIllhZGEgeWFkYSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiICBcdTAwZTFcdTAwZTJcdTAwZTNcdFx1MDBlNCIsIA0KKyAgICAgICAgICAgICAgICBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMoIj0/aXNvLTg4NTktMT9RP189MjA9ZTE9ZTI9RTM9MDk9RTQ/PSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiV29yZCAxICcgIFx1MDBlMlx1MDBlM1x0XHUwMGU0Jy4gV29yZCAyICcgIFx1MDBlMlx1MDBlM1x0XHUwMGU0JyIsIA0KKyAgICAgICAgICAgICAgICBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMoIldvcmQgMSAnPT9pc28tODg1OS0xP1E/Xz0yMD1lMj1FMz0wOT1FND89Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIicuIFdvcmQgMiAnPT9pc28tODg1OS0xP3E/Xz0yMD1lMj1FMz0wOT1FND89JyIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiPT9pc28tODg1OS1ZQURBP1E/Xz0yMD10MT1lMj1FMz0wOT1FND89IiwgDQorICAgICAgICAgICAgICAgIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9pc28tODg1OS1ZQURBP1E/Xz0yMD10MT1lMj1FMz0wOT1FND89IikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIHNob3J0IHRleHQiLCANCisgICAgICAgICAgICAgICAgRGVjb2RlclV0aWwuZGVjb2RlRW5jb2RlZFdvcmRzKCI9P1VTLUFTQ0lJP0I/UVNCemFHOXlkQ0IwWlhoMD89IikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIHNob3J0IHRleHQgYWdhaW4hIiwgDQorICAgICAgICAgICAgICAgIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9VUy1BU0NJST9iP1FTQnphRzl5ZENCMFpYaDBJR0ZuWVdsdUlRPT0/PSIpKTsNCisNCisgICAgICAgIC8vIGludmFsaWQgZW5jb2RlZCB3b3JkcyBzaG91bGQgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkDQorICAgICAgICBhc3NlcnRFcXVhbHMoIj0/aXNvODg1OS0xP1E/PSIsIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9pc284ODU5LTE/UT89IikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P2lzbzg4NTktMT9iPz0iLCBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMoIj0/aXNvODg1OS0xP2I/PSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiPT9JU08tODg1OS0xP1E/IiwgRGVjb2RlclV0aWwuZGVjb2RlRW5jb2RlZFdvcmRzKCI9P0lTTy04ODU5LTE/UT8iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIj0/SVNPLTg4NTktMT9SP2FiYz89IiwgRGVjb2RlclV0aWwuZGVjb2RlRW5jb2RlZFdvcmRzKCI9P0lTTy04ODU5LTE/Uj9hYmM/PSIpKTsNCisNCisgICAgICAgIC8vIGVuY29kZWQtdGV4dCByZXF1aXJlcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFjY29yZGluZyB0byByZmMgMjA0Nw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P0lTTy04ODU5LTE/UT8/PSIsIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9JU08tODg1OS0xP1E/Pz0iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIj0/SVNPLTg4NTktMT9CPz89IiwgRGVjb2RlclV0aWwuZGVjb2RlRW5jb2RlZFdvcmRzKCI9P0lTTy04ODU5LTE/Qj8/PSIpKTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gd2hpdGUgc3BhY2UgYmV0d2VlbiBlbmNvZGVkIHdvcmRzIHNob3VsZCBiZSByZW1vdmVkIChNSU1FNEotMTA0KQ0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgRGVjb2RlclV0aWwuZGVjb2RlRW5jb2RlZFdvcmRzKCI9P0lTTy04ODU5LTE/UT9hPz0iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImEgYiIsIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9JU08tODg1OS0xP1E/YT89IGIiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImFiIiwgRGVjb2RlclV0aWwuZGVjb2RlRW5jb2RlZFdvcmRzKCI9P0lTTy04ODU5LTE/UT9hPz0gPT9JU08tODg1OS0xP1E/Yj89IikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYiIsIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9JU08tODg1OS0xP1E/YT89ICA9P0lTTy04ODU5LTE/UT9iPz0iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImFiIiwgRGVjb2RlclV0aWwuZGVjb2RlRW5jb2RlZFdvcmRzKCI9P0lTTy04ODU5LTE/UT9hPz1cclxuICA9P0lTTy04ODU5LTE/UT9iPz0iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImEgYiIsIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9JU08tODg1OS0xP1E/YV9iPz0iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImEgYiIsIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9JU08tODg1OS0xP1E/YT89ID0/SVNPLTg4NTktMj9RP19iPz0iKSk7DQorDQorICAgICAgICAvLyBub24gd2hpdGUgc3BhY2UgYmV0d2VlbiBlbmNvZGVkIHdvcmRzIHNob3VsZCBiZSByZXRhaW5lZA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIGIgYyIsIERlY29kZXJVdGlsLmRlY29kZUVuY29kZWRXb3JkcygiPT9JU08tODg1OS0xP1E/YT89IGIgPT9JU08tODg1OS0xP1E/Yz89IikpOw0KKw0KKyAgICAgICAgLy8gdGV4dCBiZWZvcmUgYW5kIGFmdGVyIGVuY29kZWQgd29yZHMgc2hvdWxkIGJlIHJldGFpbmVkDQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBhIGIgYyAiLCBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMoIiA9P0lTTy04ODU5LTE/UT9hPz0gYiA9P0lTTy04ODU5LTE/UT9jPz0gIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIhIGEgYiBjICEiLCBEZWNvZGVyVXRpbC5kZWNvZGVFbmNvZGVkV29yZHMoIiEgPT9JU08tODg1OS0xP1E/YT89IGIgPT9JU08tODg1OS0xP1E/Yz89ICEiKSk7DQorICAgICAgICANCisgICAgICAgIC8vIEJ1ZyBkZXRlY3RlZCBvbiBKdW5lIDcsIDIwMDUuIERlY29kaW5nIHRoZSBmb2xsb3dpbmcgc3RyaW5nIGNhdXNlZA0KKyAgICAgICAgLy8gT3V0T2ZNZW1vcnlFcnJvci4NCisgICAgICAgIGFzc2VydEVxdWFscygiPTM/ISFcXD0/XCIhZzZQXCIhWHA6XCIhIiwgRGVjb2RlclV0aWwuZGVjb2RlRW5jb2RlZFdvcmRzKCI9Mz8hIVxcPT9cIiFnNlBcIiFYcDpcIiEiKSk7DQorICAgIH0gICAgDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvRW5jb2RlclV0aWxUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0VuY29kZXJVdGlsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWU3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL0VuY29kZXJVdGlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLkVuY29kZXJVdGlsLkVuY29kaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLkVuY29kZXJVdGlsLlVzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CisKK3B1YmxpYyBjbGFzcyBFbmNvZGVyVXRpbFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlQWRkcmVzc0Rpc3BsYXlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiXCJcIiIsIEVuY29kZXJVdGlsLmVuY29kZUFkZHJlc3NEaXNwbGF5TmFtZSgiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBFbmNvZGVyVXRpbC5lbmNvZGVBZGRyZXNzRGlzcGxheU5hbWUoInRlc3QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIHRlc3QgIiwgRW5jb2RlclV0aWwuZW5jb2RlQWRkcmVzc0Rpc3BsYXlOYW1lKCIgdGVzdCAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIHRlc3RcdHRlc3QgIiwgRW5jb2RlclV0aWwKKyAgICAgICAgICAgICAgICAuZW5jb2RlQWRkcmVzc0Rpc3BsYXlOYW1lKCIgdGVzdFx0dGVzdCAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXCJ0ZXN0KClcIiIsIEVuY29kZXJVdGlsCisgICAgICAgICAgICAgICAgLmVuY29kZUFkZHJlc3NEaXNwbGF5TmFtZSgidGVzdCgpIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlwiSm9obiBRLiBQdWJsaWNcIiIsIEVuY29kZXJVdGlsCisgICAgICAgICAgICAgICAgLmVuY29kZUFkZHJlc3NEaXNwbGF5TmFtZSgiSm9obiBRLiBQdWJsaWMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiXCJHaWFudDsgXFxcIkJpZ1xcXCIgQm94XCIiLCBFbmNvZGVyVXRpbAorICAgICAgICAgICAgICAgIC5lbmNvZGVBZGRyZXNzRGlzcGxheU5hbWUoIkdpYW50OyBcIkJpZ1wiIEJveCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P0lTTy04ODU5LTE/UT9TZW1tZWxicj1GNnNlbD89IiwgRW5jb2RlclV0aWwKKyAgICAgICAgICAgICAgICAuZW5jb2RlQWRkcmVzc0Rpc3BsYXlOYW1lKCJTZW1tZWxiclwzNjZzZWwiKSk7CisgICAgICAgIC8vIGRvbGxhciBzaWduIGFzIHRvIGJlIGVuY29kZWQgYXMgPTI0IHdoZW4gdXNlZCBhcyBhIHdvcmQgaW4gYSBwaHJhc2UKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P1VURi04P1E/RG9sbGFyXz0yNF9FdXJvXz1FMj04Mj1BQz89IiwgRW5jb2RlclV0aWwKKyAgICAgICAgICAgICAgICAuZW5jb2RlQWRkcmVzc0Rpc3BsYXlOYW1lKCJEb2xsYXIgJCBFdXJvIFx1MjBhYyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlQWRkcmVzc0xvY2FsUGFydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImpvaG4ud2F5bmUiLCBFbmNvZGVyVXRpbAorICAgICAgICAgICAgICAgIC5lbmNvZGVBZGRyZXNzTG9jYWxQYXJ0KCJqb2huLndheW5lIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlwiY2xpbnQgZWFzdHdvb2RcIiIsIEVuY29kZXJVdGlsCisgICAgICAgICAgICAgICAgLmVuY29kZUFkZHJlc3NMb2NhbFBhcnQoImNsaW50IGVhc3R3b29kIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVIZWFkZXJQYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwPXRlc3QiLCBFbmNvZGVyVXRpbC5lbmNvZGVIZWFkZXJQYXJhbWV0ZXIoInAiLCAidGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwPVwidGVzdCB0ZXN0XCIiLCBFbmNvZGVyVXRpbC5lbmNvZGVIZWFkZXJQYXJhbWV0ZXIoInAiLAorICAgICAgICAgICAgICAgICJ0ZXN0IHRlc3QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicD1cIj10ZXN0XCIiLCBFbmNvZGVyVXRpbC5lbmNvZGVIZWFkZXJQYXJhbWV0ZXIoInAiLAorICAgICAgICAgICAgICAgICI9dGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwPVwiXFxcXHRlc3RcIiIsIEVuY29kZXJVdGlsLmVuY29kZUhlYWRlclBhcmFtZXRlcigicCIsCisgICAgICAgICAgICAgICAgIlxcdGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwPVwiXFxcIlxcXFxcXFwiXCIiLCBFbmNvZGVyVXRpbC5lbmNvZGVIZWFkZXJQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgInAiLCAiXCJcXFwiIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNUb0JlRW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShFbmNvZGVyVXRpbC5oYXNUb0JlRW5jb2RlZCgiIiwgMCkpOworICAgICAgICBhc3NlcnRGYWxzZShFbmNvZGVyVXRpbC5oYXNUb0JlRW5jb2RlZCgib25seSBhc2NpaSBjaGFyYWN0ZXJzIiwgMCkpOworCisgICAgICAgIGFzc2VydFRydWUoRW5jb2RlclV0aWwuaGFzVG9CZUVuY29kZWQoIm5vbi1wcmludGFibGUgYXNjaWk6IFwwMTAiLCAwKSk7CisgICAgICAgIGFzc2VydFRydWUoRW5jb2RlclV0aWwuaGFzVG9CZUVuY29kZWQoIm5vbi1hc2NpaTogXHUyMGFjIiwgMCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKEVuY29kZXJVdGlsLmhhc1RvQmVFbmNvZGVkKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1NjciLAorICAgICAgICAgICAgICAgIDUwKSk7CisgICAgICAgIGFzc2VydFRydWUoRW5jb2RlclV0aWwuaGFzVG9CZUVuY29kZWQoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NzgiLAorICAgICAgICAgICAgICAgIDUwKSk7CisgICAgICAgIGFzc2VydEZhbHNlKEVuY29kZXJVdGlsLmhhc1RvQmVFbmNvZGVkKAorICAgICAgICAgICAgICAgICJcdDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IiwgNTApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlRW5jb2RlZFdvcmREZXRlY3RDaGFyc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoRW5jb2RlclV0aWwKKyAgICAgICAgICAgICAgICAuZW5jb2RlRW5jb2RlZFdvcmQoIm9ubHkgYXNjaWkiLCBVc2FnZS5URVhUX1RPS0VOKS5zdGFydHNXaXRoKAorICAgICAgICAgICAgICAgICAgICAgICAgIj0/VVMtQVNDSUk/IikpOworICAgICAgICBhc3NlcnRUcnVlKEVuY29kZXJVdGlsLmVuY29kZUVuY29kZWRXb3JkKCJsYXRpbiAxOiBcMzQ0IiwKKyAgICAgICAgICAgICAgICBVc2FnZS5URVhUX1RPS0VOKS5zdGFydHNXaXRoKCI9P0lTTy04ODU5LTE/IikpOworICAgICAgICBhc3NlcnRUcnVlKEVuY29kZXJVdGlsLmVuY29kZUVuY29kZWRXb3JkKCJ1bmljb2RlOiBcdTIwYWMiLAorICAgICAgICAgICAgICAgIFVzYWdlLlRFWFRfVE9LRU4pLnN0YXJ0c1dpdGgoIj0/VVRGLTg/IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVFbmNvZGVkV29yZEZvcmNlQ2hhcnNldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKEVuY29kZXJVdGlsLmVuY29kZUVuY29kZWRXb3JkKCJvbmx5IGFzY2lpIiwKKyAgICAgICAgICAgICAgICBVc2FnZS5URVhUX1RPS0VOLCAwLCBDaGFyc2V0VXRpbC5VVEZfOCwgbnVsbCkuc3RhcnRzV2l0aCgKKyAgICAgICAgICAgICAgICAiPT9VVEYtOD8iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZUVuY29kZWRXb3JkRGV0ZWN0RW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbmNvZGVyVXRpbAorICAgICAgICAgICAgICAgIC5lbmNvZGVFbmNvZGVkV29yZCgib25seSBhc2NpaSIsIFVzYWdlLlRFWFRfVE9LRU4pLnN0YXJ0c1dpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAiPT9VUy1BU0NJST9RPyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShFbmNvZGVyVXRpbC5lbmNvZGVFbmNvZGVkV29yZCgiXDM0NFwzNDRcMzQ0XDM0NFwzNDQiLAorICAgICAgICAgICAgICAgIFVzYWdlLlRFWFRfVE9LRU4pLnN0YXJ0c1dpdGgoIj0/SVNPLTg4NTktMT9CPyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlRW5jb2RlZFdvcmRGb3JjZUVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoRW5jb2RlclV0aWwuZW5jb2RlRW5jb2RlZFdvcmQoIm9ubHkgYXNjaWkiLAorICAgICAgICAgICAgICAgIFVzYWdlLlRFWFRfVE9LRU4sIDAsIG51bGwsIEVuY29kaW5nLkIpLnN0YXJ0c1dpdGgoCisgICAgICAgICAgICAgICAgIj0/VVMtQVNDSUk/Qj8iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZUVuY29kZWRXb3JkU3BsaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHNpeHR5ID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCI7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIj0/VVMtQVNDSUk/UT8iICsgc2l4dHkgKyAiPz0iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEVuY29kZXJVdGlsLmVuY29kZUVuY29kZWRXb3JkKHNpeHR5LAorICAgICAgICAgICAgICAgIFVzYWdlLlRFWFRfVE9LRU4sIDAsIG51bGwsIEVuY29kaW5nLlEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDc1LCBleHBlY3RlZC5sZW5ndGgoKSk7CisKKyAgICAgICAgU3RyaW5nIHNpeHR5T25lID0gc2l4dHkgKyAiMSI7CisgICAgICAgIFN0cmluZyBlbmNvZGVkU2l4dHlPbmUgPSBFbmNvZGVyVXRpbC5lbmNvZGVFbmNvZGVkV29yZChzaXh0eU9uZSwKKyAgICAgICAgICAgICAgICBVc2FnZS5URVhUX1RPS0VOLCAwLCBudWxsLCBFbmNvZGluZy5RKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbmNvZGVkU2l4dHlPbmUuY29udGFpbnMoIj89ID0/VVMtQVNDSUk/UT8iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZUVuY29kZWRXb3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiPT9VUy1BU0NJST9RPz89IiwgRW5jb2RlclV0aWwuZW5jb2RlRW5jb2RlZFdvcmQoIiIsCisgICAgICAgICAgICAgICAgVXNhZ2UuVEVYVF9UT0tFTiwgMCwgbnVsbCwgRW5jb2RpbmcuUSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiPT9VUy1BU0NJST9RP3Rlc3RpbmdfMTIzPz0iLCBFbmNvZGVyVXRpbAorICAgICAgICAgICAgICAgIC5lbmNvZGVFbmNvZGVkV29yZCgidGVzdGluZyAxMjMiLCBVc2FnZS5URVhUX1RPS0VOLCAwLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmcuUSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiPT9VUy1BU0NJST9CP2RHVnpkR2x1WnlBeE1qTT0/PSIsIEVuY29kZXJVdGlsCisgICAgICAgICAgICAgICAgLmVuY29kZUVuY29kZWRXb3JkKCJ0ZXN0aW5nIDEyMyIsIFVzYWdlLlRFWFRfVE9LRU4sIDAsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZy5CKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P3dpbmRvd3MtMTI1Mj9RPzEwMF89ODA/PSIsIEVuY29kZXJVdGlsCisgICAgICAgICAgICAgICAgLmVuY29kZUVuY29kZWRXb3JkKCIxMDAgXHUyMGFjIiwgVXNhZ2UuVEVYVF9UT0tFTiwgMCwgQ2hhcnNldAorICAgICAgICAgICAgICAgICAgICAgICAgLmZvck5hbWUoIkNwMTI1MiIpLCBFbmNvZGluZy5RKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P3dpbmRvd3MtMTI1Mj9CP01UQXdJSUE9Pz0iLCBFbmNvZGVyVXRpbAorICAgICAgICAgICAgICAgIC5lbmNvZGVFbmNvZGVkV29yZCgiMTAwIFx1MjBhYyIsIFVzYWdlLlRFWFRfVE9LRU4sIDAsIENoYXJzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JOYW1lKCJDcDEyNTIiKSwgRW5jb2RpbmcuQikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVCKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZW5jb2RlQigiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllRPT0iLCBlbmNvZGVCKCJhIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXST0iLCBlbmNvZGVCKCJhYiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZV0pqIiwgZW5jb2RlQigiYWJjIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaQT09IiwgZW5jb2RlQigiYWJjZCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJZV0pqWkdVPSIsIGVuY29kZUIoImFiY2RlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaR1ZtIiwgZW5jb2RlQigiYWJjZGVmIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIllXSmpaR1ZtWnc9PSIsIGVuY29kZUIoImFiY2RlZmciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWVdKalpHVm1aMmc9IiwgZW5jb2RlQigiYWJjZGVmZ2giKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWVdKalpHVm1aMmhwIiwgZW5jb2RlQigiYWJjZGVmZ2hpIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRRb01DUT09IiwgZW5jb2RlQigiXHJcblxmXHQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTFQwL1ZHaGhkQ2R6SUdFZ2RHVnpkRDg5TFE9PSIsCisgICAgICAgICAgICAgICAgZW5jb2RlQigiLT0/VGhhdCdzIGEgdGVzdD89LSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlUVJlZ3VsYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVsxMzJdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEzMjsgaSsrKSB7CisgICAgICAgICAgICBiW2ldID0gKGJ5dGUpIGk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiPTAwPTAxPTAyPTAzPTA0PTA1PTA2PTA3PTA4PTA5PTBBPTBCPTBDPTBEPTBFPTBGIgorICAgICAgICAgICAgICAgICsgIj0xMD0xMT0xMj0xMz0xND0xNT0xNj0xNz0xOD0xOT0xQT0xQj0xQz0xRD0xRT0xRl8hXCIjJCUmIgorICAgICAgICAgICAgICAgICsgIicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9M0Q+PTNGQEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAgICAgICsgIltcXF1ePTVGYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fj03Rj04MD04MT04Mj04MyI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgRW5jb2RlclV0aWwuZW5jb2RlUShiLCBVc2FnZS5URVhUX1RPS0VOKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVFSZXN0cmljdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTM2XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMzY7IGkrKykgeworICAgICAgICAgICAgYltpXSA9IChieXRlKSBpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIj0wMD0wMT0wMj0wMz0wND0wNT0wNj0wNz0wOD0wOT0wQT0wQj0wQz0wRD0wRT0wRiIKKyAgICAgICAgICAgICAgICArICI9MTA9MTE9MTI9MTM9MTQ9MTU9MTY9MTc9MTg9MTk9MUE9MUI9MUM9MUQ9MUU9MUZfIT0yMj0yMyIKKyAgICAgICAgICAgICAgICArICI9MjQ9MjU9MjY9Mjc9Mjg9MjkqKz0yQy09MkUvMDEyMzQ1Njc4OT0zQT0zQj0zQz0zRD0zRT0zRiIKKyAgICAgICAgICAgICAgICArICI9NDBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWj01Qj01Qz01RD01RT01Rj02MGFiY2RlZmdoaSIKKyAgICAgICAgICAgICAgICArICJqa2xtbm9wcXJzdHV2d3h5ej03Qj03Qz03RD03RT03Rj04MD04MT04Mj04Mz04ND04NT04Nj04NyI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgRW5jb2RlclV0aWwuZW5jb2RlUShiLCBVc2FnZS5XT1JEX0VOVElUWSkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZUIoU3RyaW5nIHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBFbmNvZGVyVXRpbC5lbmNvZGVCKHMuZ2V0Qnl0ZXMoInVzLWFzY2lpIikpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9RdW90ZWRQcmludGFibGVFbmNvZGVUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1F1b3RlZFByaW50YWJsZUVuY29kZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzEyNDNmCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9RdW90ZWRQcmludGFibGVFbmNvZGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNoYXJzZXRVdGlsOworCitwdWJsaWMgY2xhc3MgUXVvdGVkUHJpbnRhYmxlRW5jb2RlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RFc2NhcGVkU29mdEJyZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGVbNTAwXTsKKyAgICAgICAgQXJyYXlzLmZpbGwoY29udGVudCwgKGJ5dGUpMHgyMCk7CisgICAgICAgIGJ5dGVbXSBleHBlY3RlZCA9IG5ldyBieXRlWzE1NTddOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKGludCBsPTA7bDwyMDtsKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPDI1O2krKykgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkW2luZGV4KytdID0gJz0nOworICAgICAgICAgICAgICAgIGV4cGVjdGVkW2luZGV4KytdID0gJzInOworICAgICAgICAgICAgICAgIGV4cGVjdGVkW2luZGV4KytdID0gJzAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGw8MTkpIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFtpbmRleCsrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFtpbmRleCsrXSA9ICdccic7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaW5kZXgrK10gPSAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNoZWNrKGNvbnRlbnQsIGV4cGVjdGVkKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFBsYWluQXNjaWlTb2Z0QnJlYWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBuZXcgYnl0ZVs1MDBdOworICAgICAgICBBcnJheXMuZmlsbChjb250ZW50LCAoYnl0ZSkweDI5KTsKKyAgICAgICAgYnl0ZVtdIGV4cGVjdGVkID0gbmV3IGJ5dGVbNTE4XTsKKyAgICAgICAgQXJyYXlzLmZpbGwoZXhwZWN0ZWQsIChieXRlKTB4MjkpOworICAgICAgICBleHBlY3RlZFs3NV0gPSAnPSc7CisgICAgICAgIGV4cGVjdGVkWzc2XSA9ICdccic7CisgICAgICAgIGV4cGVjdGVkWzc3XSA9ICdcbic7CisgICAgICAgIGV4cGVjdGVkWzE1M10gPSAnPSc7CisgICAgICAgIGV4cGVjdGVkWzE1NF0gPSAnXHInOworICAgICAgICBleHBlY3RlZFsxNTVdID0gJ1xuJzsKKyAgICAgICAgZXhwZWN0ZWRbMjMxXSA9ICc9JzsKKyAgICAgICAgZXhwZWN0ZWRbMjMyXSA9ICdccic7CisgICAgICAgIGV4cGVjdGVkWzIzM10gPSAnXG4nOworICAgICAgICBleHBlY3RlZFszMDldID0gJz0nOworICAgICAgICBleHBlY3RlZFszMTBdID0gJ1xyJzsKKyAgICAgICAgZXhwZWN0ZWRbMzExXSA9ICdcbic7CisgICAgICAgIGV4cGVjdGVkWzM4N10gPSAnPSc7CisgICAgICAgIGV4cGVjdGVkWzM4OF0gPSAnXHInOworICAgICAgICBleHBlY3RlZFszODldID0gJ1xuJzsKKyAgICAgICAgZXhwZWN0ZWRbNDY1XSA9ICc9JzsKKyAgICAgICAgZXhwZWN0ZWRbNDY2XSA9ICdccic7CisgICAgICAgIGV4cGVjdGVkWzQ2N10gPSAnXG4nOworICAgICAgICBjaGVjayhjb250ZW50LCBleHBlY3RlZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbkFTQ0lJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrUm91bmR0cmlwKCJUaGlzaXNhdmVyeXNpbXBsZW1lc3NhZ2UuVGhpc2lzYXZlcnlzaW1wbGVtZXNzYWdlLlRoaXNpc2F2ZXJ5c2ltcGxlbWVzc2FnZS4iICsKKyAgICAgICAgICAgICAgICAiVGhpc2lzYXZlcnlzaW1wbGVtZXNzYWdlLlRoaXNpc2F2ZXJ5c2ltcGxlbWVzc2FnZS5UaGlzaXNhdmVyeXNpbXBsZW1lc3NhZ2UuIiArCisgICAgICAgICAgICAgICAgIlRoaXNpc2F2ZXJ5c2ltcGxlbWVzc2FnZS5UaGlzaXNhdmVyeXNpbXBsZW1lc3NhZ2UuVGhpc2lzYXZlcnlzaW1wbGVtZXNzYWdlLiIgKworICAgICAgICAgICAgICAgICJUaGlzaXNhdmVyeXNpbXBsZW1lc3NhZ2UuVGhpc2lzYXZlcnlzaW1wbGVtZXNzYWdlLlRoaXNpc2F2ZXJ5c2ltcGxlbWVzc2FnZS4iKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrUm91bmR0cmlwKCIgICAgICAgICAgICAgICAgICIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGV0dGVyRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChieXRlIGI9MDtiPEJ5dGUuTUFYX1ZBTFVFO2IrKykgeworICAgICAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSB7Yn07CisgICAgICAgICAgICBjaGVja1JvdW5kdHJpcChjb250ZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSb3VuZHRyaXAoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVja1JvdW5kdHJpcChjb250ZW50LCBDaGFyc2V0VXRpbC5VU19BU0NJSSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUm91bmR0cmlwKFN0cmluZyBjb250ZW50LCBDaGFyc2V0IGNoYXJzZXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVja1JvdW5kdHJpcChjaGFyc2V0LmVuY29kZShjb250ZW50KS5hcnJheSgpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUm91bmR0cmlwKGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudCk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVjVXRpbC5lbmNvZGVRdW90ZWRQcmludGFibGVCaW5hcnkoaW4sIG91dCk7CisgICAgICAgIC8vIHJlYWQgYmFjayB0aHJvdWdoIGRlY29kZXIKKyAgICAgICAgaW4gPSBuZXcgUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgSU9VdGlscy5jb3B5KGluLCBvdXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGVudCwgb3V0LnRvQnl0ZUFycmF5KCkpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2hlY2soYnl0ZVtdIGNvbnRlbnQsIGJ5dGVbXSBleHBlY3RlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBDb2RlY1V0aWwuZW5jb2RlUXVvdGVkUHJpbnRhYmxlQmluYXJ5KGluLCBvdXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG91dC50b0J5dGVBcnJheSgpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFscyhieXRlW10gZXhwZWN0ZWQsIGJ5dGVbXSBhY3R1YWwpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgYWN0dWFsLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1pc21hdGNoQCIgKyBpLCBleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1F1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTg1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1F1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7DQorDQorcHVibGljIGNsYXNzIFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgew0KKyAgICAgICAgQmFzaWNDb25maWd1cmF0b3IucmVzZXRDb25maWd1cmF0aW9uKCk7DQorICAgICAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7DQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBudWxsOw0KKyAgICAgICAgUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW0gZGVjb2RlciA9IG51bGw7DQorDQorICAgICAgICBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIj1lMT1lMj1FMz1FNFxyXG4iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsNCisgICAgICAgIGRlY29kZXIgPSBuZXcgUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW0oYmlzKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiXHUwMGUxXHUwMGUyXHUwMGUzXHUwMGU0XHJcbiIsIG5ldyBTdHJpbmcocmVhZChkZWNvZGVyKSwgIklTTzg4NTktMSIpKTsNCisgICAgICAgIA0KKyAgICAgICAgYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCI9ZTE9ZzI9RTM9RTRcclxuIi5nZXRCeXRlcygiVVMtQVNDSUkiKSk7DQorICAgICAgICBkZWNvZGVyID0gbmV3IFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDBlMT1nMlx1MDBlM1x1MDBlNFxyXG4iLCBuZXcgU3RyaW5nKHJlYWQoZGVjb2RlciksICJJU084ODU5LTEiKSk7DQorICAgICAgICANCisgICAgICAgIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiICAgPWUxID1lMiAgPUUzXHQ9RTQgIFx0IFx0ICAgIFxyXG4iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsNCisgICAgICAgIGRlY29kZXIgPSBuZXcgUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW0oYmlzKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiICAgXHUwMGUxIFx1MDBlMiAgXHUwMGUzXHRcdTAwZTRcclxuIiwgbmV3IFN0cmluZyhyZWFkKGRlY29kZXIpLCAiSVNPODg1OS0xIikpOw0KKyAgICAgICAgDQorICAgICAgICAvKg0KKyAgICAgICAgICogVGVzdCBzb2Z0IGxpbmUgYnJlYWtzLg0KKyAgICAgICAgICovDQorICAgICAgICBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIlNvZnQgbGluZSAgID0gXHQgXHJcbkhhcmQgbGluZSAgIFxyXG4iLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsNCisgICAgICAgIGRlY29kZXIgPSBuZXcgUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW0oYmlzKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiU29mdCBsaW5lICAgSGFyZCBsaW5lXHJcbiIsIG5ldyBTdHJpbmcocmVhZChkZWNvZGVyKSwgIklTTzg4NTktMSIpKTsNCisgICAgICAgIA0KKyAgICAgICAgLyoNCisgICAgICAgICAqIFRoaXMgaXNuJ3QgdmFsaWQgcXAgKD09KSBidXQgaXQgaXMga25vd24gdG8gb2NjdXIgaW4gY2VydGFpbg0KKyAgICAgICAgICogbWVzc2FnZXMsIGVzcGVjaWFsbHkgc3BhbS4NCisgICAgICAgICAqLw0KKyAgICAgICAgYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJ3aWR0aD09XHJcbjM0MCBoZWlnaHQ9M2QyMDBcclxuIi5nZXRCeXRlcygiVVMtQVNDSUkiKSk7DQorICAgICAgICBkZWNvZGVyID0gbmV3IFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIndpZHRoPTM0MCBoZWlnaHQ9MjAwXHJcbiIsIG5ldyBTdHJpbmcocmVhZChkZWNvZGVyKSwgIklTTzg4NTktMSIpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlUHJlbWF0dXJlQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbnVsbDsNCisgICAgICAgIFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtIGRlY29kZXIgPSBudWxsOw0KKw0KKyAgICAgICAgYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCI9ZTE9ZTI9RTM9RTRcclxuIi5nZXRCeXRlcygiVVMtQVNDSUkiKSk7DQorICAgICAgICBkZWNvZGVyID0gbmV3IFF1b3RlZFByaW50YWJsZUlucHV0U3RyZWFtKGJpcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoJ1x1MDBlMScsIGRlY29kZXIucmVhZCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygnXHUwMGUyJywgZGVjb2Rlci5yZWFkKCkpOw0KKyAgICAgICAgZGVjb2Rlci5jbG9zZSgpOw0KKyAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGRlY29kZXIucmVhZCgpOw0KKyAgICAgICAgICAgIGZhaWwoKTsNCisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgYnl0ZVtdIHJlYWQoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICAgICAgaW50IGI7DQorICAgICAgICB3aGlsZSAoKGIgPSBpcy5yZWFkKCkpICE9IC0xKSB7DQorICAgICAgICAgICAgYm9zLndyaXRlKGIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIGJvcy50b0J5dGVBcnJheSgpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvUXVvdGVkUHJpbnRhYmxlT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9RdW90ZWRQcmludGFibGVPdXRwdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4NjNmOAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovY29kZWMvUXVvdGVkUHJpbnRhYmxlT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFF1b3RlZFByaW50YWJsZU91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG51bGw7CisgICAgICAgIFF1b3RlZFByaW50YWJsZU91dHB1dFN0cmVhbSBlbmNvZGVyID0gbnVsbDsKKyAgICAgICAgCisgICAgICAgIC8qCisgICAgICAgICAqIFNpbXBsZSBpbml0aWFsIHRlc3QuCisgICAgICAgICAqLworICAgICAgICBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGVuY29kZXIgPSBuZXcgUXVvdGVkUHJpbnRhYmxlT3V0cHV0U3RyZWFtKGJvcywgZmFsc2UpOworICAgICAgICBlbmNvZGVyLndyaXRlKGZyb21TdHJpbmcoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSBjb250YWluaW5nIGEgZmV3IGV1cm9zOiAxMDAgXHUyMGFjISIpKTsKKyAgICAgICAgZW5jb2Rlci5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSBjb250YWluaW5nIGEgZmV3IGV1cm9zOiAxMDAgPUUyPTgyPUFDISIsCisgICAgICAgICAgICAgICAgdG9TdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlVW5kZXJseWluZ1N0cmVhbVN0YXlzT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBudWxsOworICAgICAgICBRdW90ZWRQcmludGFibGVPdXRwdXRTdHJlYW0gZW5jb2RlciA9IG51bGw7CisgICAgICAgIAorICAgICAgICBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGVuY29kZXIgPSBuZXcgUXVvdGVkUHJpbnRhYmxlT3V0cHV0U3RyZWFtKGJvcywgZmFsc2UpOworICAgICAgICBlbmNvZGVyLndyaXRlKGZyb21TdHJpbmcoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSBjb250YWluaW5nIGEgZmV3IGV1cm9zOiAxMDAgXHUyMGFjISIpKTsKKyAgICAgICAgZW5jb2Rlci5jbG9zZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbmNvZGVyLndyaXRlKCdiJyk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGJvcy53cml0ZSgneScpOworICAgICAgICBib3Mud3JpdGUoJ2EnKTsKKyAgICAgICAgYm9zLndyaXRlKCdkJyk7CisgICAgICAgIGJvcy53cml0ZSgnYScpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgaXMgdGhlIHBsYWluIHRleHQgbWVzc2FnZSBjb250YWluaW5nIGEgZmV3IGV1cm9zOiAxMDAgPUUyPTgyPUFDIXlhZGEiLAorICAgICAgICAgICAgICAgIHRvU3RyaW5nKGJvcy50b0J5dGVBcnJheSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gZnJvbVN0cmluZyhTdHJpbmcgcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKGJ5dGVbXSBiKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhiLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9RdW90ZWRQcmludGFibGVUZXh0RW5jb2RlVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9jb2RlYy9RdW90ZWRQcmludGFibGVUZXh0RW5jb2RlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNWQ4OTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2NvZGVjL1F1b3RlZFByaW50YWJsZVRleHRFbmNvZGVUZXN0LmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouY29kZWM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNoYXJzZXRVdGlsOworCitwdWJsaWMgY2xhc3MgUXVvdGVkUHJpbnRhYmxlVGV4dEVuY29kZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RFc2NhcGVkU29mdEJyZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGVbNTAwXTsKKyAgICAgICAgQXJyYXlzLmZpbGwoY29udGVudCwgKGJ5dGUpMHgxOCk7CisgICAgICAgIGJ5dGVbXSBleHBlY3RlZCA9IG5ldyBieXRlWzE1NTddOworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBmb3IgKGludCBsPTA7bDwyMDtsKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDtpPDI1O2krKykgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkW2luZGV4KytdID0gJz0nOworICAgICAgICAgICAgICAgIGV4cGVjdGVkW2luZGV4KytdID0gJzEnOworICAgICAgICAgICAgICAgIGV4cGVjdGVkW2luZGV4KytdID0gJzgnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGw8MTkpIHsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFtpbmRleCsrXSA9ICc9JzsKKyAgICAgICAgICAgICAgICBleHBlY3RlZFtpbmRleCsrXSA9ICdccic7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaW5kZXgrK10gPSAnXG4nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNoZWNrKGNvbnRlbnQsIGV4cGVjdGVkKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFBsYWluQXNjaWlTb2Z0QnJlYWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBuZXcgYnl0ZVs1MDBdOworICAgICAgICBBcnJheXMuZmlsbChjb250ZW50LCAoYnl0ZSkweDI5KTsKKyAgICAgICAgYnl0ZVtdIGV4cGVjdGVkID0gbmV3IGJ5dGVbNTE4XTsKKyAgICAgICAgQXJyYXlzLmZpbGwoZXhwZWN0ZWQsIChieXRlKTB4MjkpOworICAgICAgICBleHBlY3RlZFs3NV0gPSAnPSc7CisgICAgICAgIGV4cGVjdGVkWzc2XSA9ICdccic7CisgICAgICAgIGV4cGVjdGVkWzc3XSA9ICdcbic7CisgICAgICAgIGV4cGVjdGVkWzE1M10gPSAnPSc7CisgICAgICAgIGV4cGVjdGVkWzE1NF0gPSAnXHInOworICAgICAgICBleHBlY3RlZFsxNTVdID0gJ1xuJzsKKyAgICAgICAgZXhwZWN0ZWRbMjMxXSA9ICc9JzsKKyAgICAgICAgZXhwZWN0ZWRbMjMyXSA9ICdccic7CisgICAgICAgIGV4cGVjdGVkWzIzM10gPSAnXG4nOworICAgICAgICBleHBlY3RlZFszMDldID0gJz0nOworICAgICAgICBleHBlY3RlZFszMTBdID0gJ1xyJzsKKyAgICAgICAgZXhwZWN0ZWRbMzExXSA9ICdcbic7CisgICAgICAgIGV4cGVjdGVkWzM4N10gPSAnPSc7CisgICAgICAgIGV4cGVjdGVkWzM4OF0gPSAnXHInOworICAgICAgICBleHBlY3RlZFszODldID0gJ1xuJzsKKyAgICAgICAgZXhwZWN0ZWRbNDY1XSA9ICc9JzsKKyAgICAgICAgZXhwZWN0ZWRbNDY2XSA9ICdccic7CisgICAgICAgIGV4cGVjdGVkWzQ2N10gPSAnXG4nOworICAgICAgICBjaGVjayhjb250ZW50LCBleHBlY3RlZCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpbkFTQ0lJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrUm91bmR0cmlwKCJUaGlzaXNhdmVyeXNpbXBsZW1lc3NhZ2UuVGhpc2lzYXZlcnlzaW1wbGVtZXNzYWdlLlRoaXNpc2F2ZXJ5c2ltcGxlbWVzc2FnZS4iICsKKyAgICAgICAgICAgICAgICAiVGhpc2lzYXZlcnlzaW1wbGVtZXNzYWdlLlRoaXNpc2F2ZXJ5c2ltcGxlbWVzc2FnZS5UaGlzaXNhdmVyeXNpbXBsZW1lc3NhZ2UuIiArCisgICAgICAgICAgICAgICAgIlRoaXNpc2F2ZXJ5c2ltcGxlbWVzc2FnZS5UaGlzaXNhdmVyeXNpbXBsZW1lc3NhZ2UuVGhpc2lzYXZlcnlzaW1wbGVtZXNzYWdlLiIgKworICAgICAgICAgICAgICAgICJUaGlzaXNhdmVyeXNpbXBsZW1lc3NhZ2UuVGhpc2lzYXZlcnlzaW1wbGVtZXNzYWdlLlRoaXNpc2F2ZXJ5c2ltcGxlbWVzc2FnZS4iKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrUm91bmR0cmlwKCIgICAgICAgICAgICAgICAgIEEiKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdExldHRlckVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoYnl0ZSBiPTA7YjxCeXRlLk1BWF9WQUxVRTtiKyspIHsKKyAgICAgICAgICAgIGJ5dGVbXSBjb250ZW50ID0ge2J9OworICAgICAgICAgICAgLy8gV2hpdGUgc3BhY2UgaXMgb25seSBlc2NhcGVkIHdoZW4gZm9sbG93ZWQgYnkgQ1JMRgorICAgICAgICAgICAgaWYgKGIgIT0gMzIgJiYgYiAhPSA5KSB7IAorICAgICAgICAgICAgICAgIGNoZWNrUm91bmR0cmlwKGNvbnRlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDUkxGU2hvdWxkUmVzZXRMaW5lQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcig0MDk2KTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIkh1Z29cclxuIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGxvbmdMaW5lID0gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIGNoZWNrKGxvbmdMaW5lLCBsb25nTGluZSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3REb250RXNjYXBlTEYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2soIlJlYWR5XG5Gb3JcbiIsICJSZWFkeVxuRm9yXG4iKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdERvbnRFc2NhcGVDUigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVjaygiUmVhZHlcckZvclxyIiwgIlJlYWR5XHJGb3JcciIpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlU3BhY2VBdExpbmVFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2soIiAgICAgIFxyXG4iLCAiICAgICA9MjBcclxuIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3REb250RXNjYXBlU3BhY2VCZWZvcmVMaW5lRW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrKCIgICAgICAiLCAiICAgICAgIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3REb250RXNjYXBlVGFic0JlZm9yZUxpbmVFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2soIlx0XHRcdFx0IiwgIlx0XHRcdFx0Iik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3REb250V2hpdGVTcGFjZUJlZm9yZUxpbmVFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2soIiAgXHRcdCAgXHQiLCAiICBcdFx0ICBcdCIpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSb3VuZHRyaXAoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVja1JvdW5kdHJpcChjb250ZW50LCBDaGFyc2V0VXRpbC5VU19BU0NJSSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUm91bmR0cmlwKFN0cmluZyBjb250ZW50LCBDaGFyc2V0IGNoYXJzZXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVja1JvdW5kdHJpcChjaGFyc2V0LmVuY29kZShjb250ZW50KS5hcnJheSgpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUm91bmR0cmlwKGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudCk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVjVXRpbC5lbmNvZGVRdW90ZWRQcmludGFibGUoaW4sIG91dCk7CisgICAgICAgIC8vIHJlYWQgYmFjayB0aHJvdWdoIGRlY29kZXIKKyAgICAgICAgaW4gPSBuZXcgUXVvdGVkUHJpbnRhYmxlSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgSU9VdGlscy5jb3B5KGluLCBvdXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGVudCwgb3V0LnRvQnl0ZUFycmF5KCkpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2hlY2soU3RyaW5nIGNvbnRlbnQsIFN0cmluZyBleHBlY3RlZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENoYXJzZXQgYXNjaWkgPSBDaGFyc2V0VXRpbC5VU19BU0NJSTsKKyAgICAgICAgY2hlY2soYXNjaWkuZW5jb2RlKGNvbnRlbnQpLmFycmF5KCksIGFzY2lpLmVuY29kZShleHBlY3RlZCkuYXJyYXkoKSk7CisgICAgfQorCisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrKGJ5dGVbXSBjb250ZW50LCBieXRlW10gZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ29kZWNVdGlsLmVuY29kZVF1b3RlZFByaW50YWJsZShpbiwgb3V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHMoYnl0ZVtdIGV4cGVjdGVkLCBieXRlW10gYWN0dWFsKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGFjdHVhbC5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaXNtYXRjaEAiICsgaSwgZXhwZWN0ZWRbaV0sIGFjdHVhbFtpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvQmFzZVRlc3RGb3JCb2R5RGVzY3JpcHRvcnMuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9CYXNlVGVzdEZvckJvZHlEZXNjcmlwdG9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDczY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvQmFzZVRlc3RGb3JCb2R5RGVzY3JpcHRvcnMuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvcjsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRmllbGQ7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOw0KKw0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVGVzdEZvckJvZHlEZXNjcmlwdG9ycyBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE11dGFibGVCb2R5RGVzY3JpcHRvciBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKw0KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIG5ld0JvZHlEZXNjcmlwdG9yKEJvZHlEZXNjcmlwdG9yIHBhcmVudCk7DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1ldGVycygpIHsNCisgICAgICAgIE11dGFibGVCb2R5RGVzY3JpcHRvciBiZCA9IG51bGw7DQorICAgICAgICANCisgICAgICAgIGJkID0gbmV3Qm9keURlc2NyaXB0b3IoKTsNCisgICAgICAgIGJkLmFkZEZpZWxkKG5ldyBUZXN0RmllbGQoIkNvbnRlbnQtVHlwZSAiLCAidGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xOyAiDQorICAgICAgICAgICAgICAgICsgImJvdW5kYXJ5PWZvbzsgcGFyYW0xPXZhbHVlMTsgcGFyYW0yPXZhbHVlMjsgcGFyYW0zPXZhbHVlMyIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygzLCBiZC5nZXRDb250ZW50VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTEiLCBiZC5nZXRDb250ZW50VHlwZVBhcmFtZXRlcnMoKS5nZXQoInBhcmFtMSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgYmQuZ2V0Q29udGVudFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KCJwYXJhbTIiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMyIsIGJkLmdldENvbnRlbnRUeXBlUGFyYW1ldGVycygpLmdldCgicGFyYW0zIikpOw0KKyAgICAgICAgDQorICAgICAgICBiZCA9IG5ld0JvZHlEZXNjcmlwdG9yKCk7DQorICAgICAgICBiZC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUgIiwgInRleHQvcGxhaW47IHBhcmFtMT12YWx1ZTE7IHBhcmFtMj12YWx1ZTI7Ig0KKyAgICAgICAgICAgICAgICAgICAgICsgIiBwYXJhbTM9dmFsdWUzIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGJkLmdldENvbnRlbnRUeXBlUGFyYW1ldGVycygpLnNpemUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlMSIsIGJkLmdldENvbnRlbnRUeXBlUGFyYW1ldGVycygpLmdldCgicGFyYW0xIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZTIiLCBiZC5nZXRDb250ZW50VHlwZVBhcmFtZXRlcnMoKS5nZXQoInBhcmFtMiIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUzIiwgYmQuZ2V0Q29udGVudFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KCJwYXJhbTMiKSk7DQorICAgICAgICANCisgICAgICAgIGJkID0gbmV3Qm9keURlc2NyaXB0b3IoKTsNCisgICAgICAgIGJkLmFkZEZpZWxkKG5ldyBUZXN0RmllbGQoIkNvbnRlbnQtVHlwZSAiLCAidGV4dC9wbGFpbjsgIg0KKyAgICAgICAgICAgICAgICArICJwYXJhbTE9IFwiIHZhbHVlIHdpdGhcdHNwYWNlcyBcIiA7ICINCisgICAgICAgICAgICAgICAgKyAicGFyYW0yPVwiXFxcInZhbHVlNCB3aXRoIGVzY2FwZWQgXFxcIiBcXFwiXCI7IikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJkLmdldENvbnRlbnRUeXBlUGFyYW1ldGVycygpLnNpemUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiB2YWx1ZSB3aXRoXHRzcGFjZXMgIiwgYmQuZ2V0Q29udGVudFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KCJwYXJhbTEiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlwidmFsdWU0IHdpdGggZXNjYXBlZCBcIiBcIiIsIGJkLmdldENvbnRlbnRUeXBlUGFyYW1ldGVycygpLmdldCgicGFyYW0yIikpOw0KKyAgICAgICAgDQorICAgICAgICAvKg0KKyAgICAgICAgICogTWFrZSBzdXJlIGVzY2FwZWQgY2hhcmFjdGVycyAoZXhjZXB0ICIpIGFyZSBzdGlsbCBlc2NhcGVkLg0KKyAgICAgICAgICogVGhlIHBhcmFtZXRlciB2YWx1ZSBzaG91bGQgYmUgXG5cIg0KKyAgICAgICAgICovDQorICAgICAgICBiZCA9IG5ld0JvZHlEZXNjcmlwdG9yKCk7DQorICAgICAgICBiZC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUgIiwgInRleHQvcGxhaW47IHBhcmFtPVwiXFxuXFxcXFxcXCJcIiIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBiZC5nZXRDb250ZW50VHlwZVBhcmFtZXRlcnMoKS5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcXG5cXFwiIiwgYmQuZ2V0Q29udGVudFR5cGVQYXJhbWV0ZXJzKCkuZ2V0KCJwYXJhbSIpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEZpZWxkKCkgew0KKyAgICAgICAgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIGJkID0gbnVsbDsNCisgICAgICAgIA0KKyAgICAgICAgLyoNCisgICAgICAgICAqIE1ha2Ugc3VyZSB0aGF0IG9ubHkgdGhlIGZpcnN0IENvbnRlbnQtVHlwZSBoZWFkZXIgYWRkZWQgaXMgdXNlZC4NCisgICAgICAgICAqLw0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYmQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1UeXBlICIsICJ0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTEiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCBiZC5nZXRNaW1lVHlwZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiaXNvLTg4NTktMSIsIGJkLmdldENoYXJzZXQoKSk7DQorICAgICAgICBiZC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUgIiwgInRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIGJkLmdldE1pbWVUeXBlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpc28tODg1OS0xIiwgYmQuZ2V0Q2hhcnNldCgpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1pbWVUeXBlKCkgew0KKyAgICAgICAgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIGJkID0gbnVsbDsNCisgICAgICAgIA0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYmQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1UeXBlICIsICJ0ZXh0L1BMQUlOIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgYmQuZ2V0TWltZVR5cGUoKSk7DQorICAgICAgICANCisgICAgICAgIGJkID0gbmV3Qm9keURlc2NyaXB0b3IoKTsNCisgICAgICAgIGJkLmFkZEZpZWxkKG5ldyBUZXN0RmllbGQoIkNvbnRlbnQtVHlwZSAiLCAidGV4dC9QTEFJTjsiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCBiZC5nZXRNaW1lVHlwZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYmQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiY29udGVudC10eXBlIiwgIiAgIFRlWHQgLyBodG1sICAgIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L2h0bWwiLCBiZC5nZXRNaW1lVHlwZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYmQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ09OVEVOVC1UWVBFIiwgIiAgIHgtYXBwL3lhZGEgOyAgcGFyYW0gPSB5YWRhIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4LWFwcC95YWRhIiwgYmQuZ2V0TWltZVR5cGUoKSk7DQorICAgICAgICANCisgICAgICAgIGJkID0gbmV3Qm9keURlc2NyaXB0b3IoKTsNCisgICAgICAgIGJkLmFkZEZpZWxkKG5ldyBUZXN0RmllbGQoIkNPTlRFTlQtVFlQRSIsICIgICB5YWRhIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgYmQuZ2V0TWltZVR5cGUoKSk7DQorICAgICAgICANCisgICAgICAgIC8qDQorICAgICAgICAgKiBNYWtlIHN1cmUgdGhhdCBvbmx5IHRoZSBmaXJzdCBDb250ZW50LVR5cGUgaGVhZGVyIGFkZGVkIGlzIHVzZWQuDQorICAgICAgICAgKi8NCisgICAgICAgIGJkID0gbmV3Qm9keURlc2NyaXB0b3IoKTsNCisgICAgICAgIGJkLmFkZEZpZWxkKG5ldyBUZXN0RmllbGQoIkNvbnRlbnQtVHlwZSAiLCAidGV4dC9wbGFpbiIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIGJkLmdldE1pbWVUeXBlKCkpOw0KKyAgICAgICAgYmQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1UeXBlICIsICJ0ZXh0L2h0bWwiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCBiZC5nZXRNaW1lVHlwZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgLyoNCisgICAgICAgICAqIEltcGxpY2l0IG1pbWUgdHlwZXMuDQorICAgICAgICAgKi8NCisgICAgICAgIE11dGFibGVCb2R5RGVzY3JpcHRvciBjaGlsZCA9IG51bGw7DQorICAgICAgICBNdXRhYmxlQm9keURlc2NyaXB0b3IgcGFyZW50ID0gbnVsbDsNCisgICAgICAgIA0KKyAgICAgICAgcGFyZW50ID0gbmV3Qm9keURlc2NyaXB0b3IoKTsNCisgICAgICAgIHBhcmVudC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUiLCAibXV0bGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT1mb28iKSk7DQorICAgICAgICANCisgICAgICAgIGNoaWxkID0gbmV3Qm9keURlc2NyaXB0b3IocGFyZW50KTsNCisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIGNoaWxkLmdldE1pbWVUeXBlKCkpOw0KKyAgICAgICAgY2hpbGQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1UeXBlIiwgIiBjaGlsZC90eXBlIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZC90eXBlIiwgY2hpbGQuZ2V0TWltZVR5cGUoKSk7DQorICAgICAgICANCisgICAgICAgIHBhcmVudCA9IG5ld0JvZHlEZXNjcmlwdG9yKCk7DQorICAgICAgICBwYXJlbnQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1UeXBlIiwgIm11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PWZvbyIpKTsNCisgICAgICAgIA0KKyAgICAgICAgY2hpbGQgPSBuZXdCb2R5RGVzY3JpcHRvcihwYXJlbnQpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXNzYWdlL3JmYzgyMiIsIGNoaWxkLmdldE1pbWVUeXBlKCkpOw0KKyAgICAgICAgY2hpbGQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1UeXBlIiwgIiBjaGlsZC90eXBlIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZC90eXBlIiwgY2hpbGQuZ2V0TWltZVR5cGUoKSk7DQorICAgICAgICANCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlcnMoKSB7DQorICAgICAgICBNdXRhYmxlQm9keURlc2NyaXB0b3IgYmQgPSBudWxsOw0KKw0KKyAgICAgICAgLyoNCisgICAgICAgICAqIFRlc3QgY2hhcnNldC4NCisgICAgICAgICAqLw0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cy1hc2NpaSIsIGJkLmdldENoYXJzZXQoKSk7DQorICAgICAgICBiZC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUgIiwgInRleHQvdHlwZTsgY2hhcnNldD1JU08tODg1OS0xIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpc28tODg1OS0xIiwgYmQuZ2V0Q2hhcnNldCgpKTsNCisgICAgICAgIA0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cy1hc2NpaSIsIGJkLmdldENoYXJzZXQoKSk7DQorICAgICAgICBiZC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUgIiwgInRleHQvdHlwZSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidXMtYXNjaWkiLCBiZC5nZXRDaGFyc2V0KCkpOw0KKyAgICAgICAgDQorICAgICAgICAvKg0KKyAgICAgICAgICogVGVzdCBib3VuZGFyeS4NCisgICAgICAgICAqLw0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYmQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1UeXBlIiwgInRleHQvaHRtbDsgYm91bmRhcnk9eWFkYSB5YWRhIikpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChiZC5nZXRCb3VuZGFyeSgpKTsNCisNCisgICAgICAgIGJkID0gbmV3Qm9keURlc2NyaXB0b3IoKTsNCisgICAgICAgIGJkLmFkZEZpZWxkKG5ldyBUZXN0RmllbGQoIkNvbnRlbnQtVHlwZSIsICJtdWx0aXBhcnQveWFkYTsgYm91bmRhcnk9eWFkYSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieWFkYSIsIGJkLmdldEJvdW5kYXJ5KCkpOw0KKw0KKyAgICAgICAgLyoNCisgICAgICAgICAqIFRlc3Qgc29tZSB3ZWlyZCBwYXJhbWV0ZXJzLg0KKyAgICAgICAgICovDQorICAgICAgICBiZCA9IG5ld0JvZHlEZXNjcmlwdG9yKCk7DQorICAgICAgICBiZC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUiLCAibXVsdGlwYXJ0L3lhZGE7IGJvdW5kYXJ5PXlhZGEgeWFkYSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieWFkYSIsIGJkLmdldEJvdW5kYXJ5KCkpOw0KKyAgICAgICAgDQorICAgICAgICBiZCA9IG5ld0JvZHlEZXNjcmlwdG9yKCk7DQorICAgICAgICBiZC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUiLCAibXVsdGlwYXJ0L3lhZGE7IGJvVU5kYXJZPSB5YToqZGE7IFx0Y2hhcnNldFx0ID0gIGJpZzUiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInlhOipkYSIsIGJkLmdldEJvdW5kYXJ5KCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiaWc1IiwgYmQuZ2V0Q2hhcnNldCgpKTsNCisgICAgICAgIA0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYmQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1UeXBlIiwgIm11bHRpcGFydC95YWRhOyBib1VOZGFyWT0gXCJ5YSBcXFwiXFxcIlx0ZGEgXFxcIlwiOyAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlx0Y2hhcnNldFx0ID0gIFwiXFxcImhlcHBcXFwiICA9dXNcdC1hc2NpaVwiIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ5YSBcIlwiXHRkYSBcIiIsIGJkLmdldEJvdW5kYXJ5KCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcImhlcHBcIiAgPXVzXHQtYXNjaWkiLCBiZC5nZXRDaGFyc2V0KCkpOw0KKyAgICAgICAgDQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBNdXRhYmxlQm9keURlc2NyaXB0b3IgYmQgPSBudWxsOw0KKw0KKyAgICAgICAgYmQgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBiZC5nZXRDb250ZW50TGVuZ3RoKCkpOw0KKw0KKyAgICAgICAgYmQuYWRkRmllbGQobmV3IFRlc3RGaWVsZCgiQ29udGVudC1MZW5ndGgiLCAiOTkwMSIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyg5OTAxLCBiZC5nZXRDb250ZW50TGVuZ3RoKCkpOw0KKw0KKyAgICAgICAgLy8gb25seSB0aGUgZmlyc3QgY29udGVudC1sZW5ndGggY291bnRzDQorICAgICAgICBiZC5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LUxlbmd0aCIsICIxMjM5OTAxIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDk5MDEsIGJkLmdldENvbnRlbnRMZW5ndGgoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3REb0RlZmF1bHRUb1VzQXNjaWlXaGVuVW50eXBlZCgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJUbyIsICJtZUBleGFtcGxlLm9yZyIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidXMtYXNjaWkiLCBkZXNjcmlwdG9yLmdldENoYXJzZXQoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdERvTm90RGVmYXVsdFRvVXNBc2NpaUZvck5vblRleHRUeXBlcygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXdCb2R5RGVzY3JpcHRvcigpOw0KKyAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZChuZXcgVGVzdEZpZWxkKCJDb250ZW50LVR5cGUiLCAiaW1hZ2UvcG5nOyBuYW1lPWJsb2IucG5nIikpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChkZXNjcmlwdG9yLmdldENoYXJzZXQoKSk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RGaWVsZCBpbXBsZW1lbnRzIEZpZWxkIHsNCisNCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7DQorICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBib2R5Ow0KKw0KKyAgICAgICAgcHVibGljIFRlc3RGaWVsZChTdHJpbmcgbmFtZSwgU3RyaW5nIGJvZHkpew0KKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7DQorICAgICAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KKyAgICAgICAgICAgIHJldHVybiBuYW1lOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCb2R5KCkgew0KKyAgICAgICAgICAgIHJldHVybiBib2R5Ow0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVibGljIEJ5dGVTZXF1ZW5jZSBnZXRSYXcoKSB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQorICAgICAgICB9DQorICAgICAgICANCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvRGVmYXVsdEJvZHlEZXNjcmlwdG9yVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9kZXNjcmlwdG9yL0RlZmF1bHRCb2R5RGVzY3JpcHRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTNkOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9kZXNjcmlwdG9yL0RlZmF1bHRCb2R5RGVzY3JpcHRvclRlc3QuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkRlZmF1bHRCb2R5RGVzY3JpcHRvcjsKKworcHVibGljIGNsYXNzIERlZmF1bHRCb2R5RGVzY3JpcHRvclRlc3QgZXh0ZW5kcyBCYXNlVGVzdEZvckJvZHlEZXNjcmlwdG9ycyB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE11dGFibGVCb2R5RGVzY3JpcHRvciBuZXdCb2R5RGVzY3JpcHRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0Qm9keURlc2NyaXB0b3IoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIG5ld0JvZHlEZXNjcmlwdG9yKEJvZHlEZXNjcmlwdG9yIHBhcmVudCkgeworICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRCb2R5RGVzY3JpcHRvcihwYXJlbnQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZGVzY3JpcHRvci9NYXhpbWFsQm9keURlc2NyaXB0b3JUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvTWF4aW1hbEJvZHlEZXNjcmlwdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODYxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2Rlc2NyaXB0b3IvTWF4aW1hbEJvZHlEZXNjcmlwdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmRlc2NyaXB0b3I7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouRXhhbXBsZU1haWw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvci5NYXhpbWFsQm9keURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuZGF0ZXRpbWUuRGF0ZVRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLk1pbWVUb2tlblN0cmVhbTsKKworcHVibGljIGNsYXNzIE1heGltYWxCb2R5RGVzY3JpcHRvclRlc3QgZXh0ZW5kcyBCYXNlVGVzdEZvckJvZHlEZXNjcmlwdG9ycyB7CisKKyAgICBNaW1lVG9rZW5TdHJlYW0gcGFyc2VyOworICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHBhcnNlciA9IE1pbWVUb2tlblN0cmVhbS5jcmVhdGVNYXhpbWFsRGVzY3JpcHRvclN0cmVhbSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1pbWVWZXJzaW9uRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXhpbWFsQm9keURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaWJlKEV4YW1wbGVNYWlsLlJGQzgyMl9TSU1QTEVfQllURVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGVzY3JpcHRvci5nZXRNaW1lTWFqb3JWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGVzY3JpcHRvci5nZXRNaW1lTWlub3JWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnROdWxsKGRlc2NyaXB0b3IuZ2V0TWltZVZlcnNpb25QYXJzZUV4Y2VwdGlvbigpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE1pbWVWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1heGltYWxCb2R5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpYmUoRXhhbXBsZU1haWwuT05FX1BBUlRfTUlNRV9BU0NJSV9DT01NRU5UX0lOX01JTUVfVkVSU0lPTl9CWVRFUyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBkZXNjcmlwdG9yLmdldE1pbWVNYWpvclZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBkZXNjcmlwdG9yLmdldE1pbWVNaW5vclZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydE51bGwoZGVzY3JpcHRvci5nZXRNaW1lVmVyc2lvblBhcnNlRXhjZXB0aW9uKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1heGltYWxCb2R5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpYmUoRXhhbXBsZU1haWwuT05FX1BBUlRfTUlNRV84ODU5X0JZVEVTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRlc2NyaXB0b3IuZ2V0TWltZU1ham9yVmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRlc2NyaXB0b3IuZ2V0TWltZU1pbm9yVmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChkZXNjcmlwdG9yLmdldE1pbWVWZXJzaW9uUGFyc2VFeGNlcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGFtcGxlTWFpbC5DT05URU5UX0lELCBkZXNjcmlwdG9yLmdldENvbnRlbnRJZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudERlc2NyaXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1heGltYWxCb2R5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpYmUoRXhhbXBsZU1haWwuT05FX1BBUlRfTUlNRV84ODU5X0JZVEVTKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRlc2NyaXB0b3IuZ2V0TWltZU1ham9yVmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRlc2NyaXB0b3IuZ2V0TWltZU1pbm9yVmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChkZXNjcmlwdG9yLmdldE1pbWVWZXJzaW9uUGFyc2VFeGNlcHRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGFtcGxlTWFpbC5DT05URU5UX0RFU0NSSVBUSU9OLCBkZXNjcmlwdG9yLmdldENvbnRlbnREZXNjcmlwdGlvbigpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE1pbWVWZXJzaW9uSGVhZGVyQnJlYWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWF4aW1hbEJvZHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkZXNjcmliZShFeGFtcGxlTWFpbC5PTkVfUEFSVF9NSU1FX0FTQ0lJX01JTUVfVkVSU0lPTl9TUEFOU19UV09fTElORVNfQllURVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZGVzY3JpcHRvci5nZXRNaW1lTWFqb3JWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGVzY3JpcHRvci5nZXRNaW1lTWlub3JWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnROdWxsKGRlc2NyaXB0b3IuZ2V0TWltZVZlcnNpb25QYXJzZUV4Y2VwdGlvbigpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnREaXNwb3NpdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWF4aW1hbEJvZHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkZXNjcmliZShFeGFtcGxlTWFpbC5PTkVfUEFSVF9NSU1FX0JBU0U2NF9MQVRJTjFfQllURVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlubGluZSIsIGRlc2NyaXB0b3IuZ2V0Q29udGVudERpc3Bvc2l0aW9uVHlwZSgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnREaXNwb3NpdGlvblR5cGVDYXNlQ29udmVyc2lvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXhpbWFsQm9keURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaWJlKEV4YW1wbGVNYWlsLk9ORV9QQVJUX01JTUVfQkFTRTY0X0xBVElOMV9CWVRFUyk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGJlIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlIiwgImlubGluZSIsIGRlc2NyaXB0b3IuZ2V0Q29udGVudERpc3Bvc2l0aW9uVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdG9yLmdldENvbnRlbnREaXNwb3NpdGlvblBhcmFtZXRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBkZXNjcmlwdG9yLmdldENvbnRlbnREaXNwb3NpdGlvblBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudERpc3Bvc2l0aW9uUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXhpbWFsQm9keURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaWJlKEV4YW1wbGVNYWlsLk9ORV9QQVJUX01JTUVfV0lUSF9DT05URU5UX0RJU1BPU0lUSU9OX1BBUkFNRVRFUlNfQllURVMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlubGluZSIsIGRlc2NyaXB0b3IuZ2V0Q29udGVudERpc3Bvc2l0aW9uVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdG9yLmdldENvbnRlbnREaXNwb3NpdGlvblBhcmFtZXRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBkZXNjcmlwdG9yLmdldENvbnRlbnREaXNwb3NpdGlvblBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgZGVzY3JpcHRvci5nZXRDb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzKCkuZ2V0KCJwYXJhbSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgZGVzY3JpcHRvci5nZXRDb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzKCkuZ2V0KCJvbmUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZGVzY3JpcHRvci5nZXRDb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzKCkuZ2V0KCJmb28iKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50RGlzcG9zaXRpb25TdGFuZGFyZFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWF4aW1hbEJvZHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkZXNjcmliZShFeGFtcGxlTWFpbC5NVUxUSVBBUlRfV0lUSF9CSU5BUllfQVRUQUNITUVOVFNfQllURVMsIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImF0dGFjaG1lbnQiLCBkZXNjcmlwdG9yLmdldENvbnRlbnREaXNwb3NpdGlvblR5cGUoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGVzY3JpcHRvci5nZXRDb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgZGVzY3JpcHRvci5nZXRDb250ZW50RGlzcG9zaXRpb25QYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJibG9iLnBuZyIsIGRlc2NyaXB0b3IuZ2V0Q29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRGF0ZVRpbWUoIjIwMDgiLCA2LCAyMSwgMTUsIDMyLCAxOCwgMCksIGRlc2NyaXB0b3IuZ2V0Q29udGVudERpc3Bvc2l0aW9uTW9kaWZpY2F0aW9uRGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEYXRlVGltZSgiMjAwOCIsIDYsIDIwLCAxMCwgMTUsIDksIDApLCBkZXNjcmlwdG9yLmdldENvbnRlbnREaXNwb3NpdGlvbkNyZWF0aW9uRGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEYXRlVGltZSgiMjAwOCIsIDYsIDIyLCAxMiwgOCwgNTYsIDApLCBkZXNjcmlwdG9yLmdldENvbnRlbnREaXNwb3NpdGlvblJlYWREYXRlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAyMzQsIGRlc2NyaXB0b3IuZ2V0Q29udGVudERpc3Bvc2l0aW9uU2l6ZSgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdExhbmd1YWdlUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXhpbWFsQm9keURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaWJlKEV4YW1wbGVNYWlsLk1VTFRJUEFSVF9XSVRIX0JJTkFSWV9BVFRBQ0hNRU5UU19CWVRFUywgMyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGVzY3JpcHRvci5nZXRDb250ZW50TGFuZ3VhZ2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBkZXNjcmlwdG9yLmdldENvbnRlbnRMYW5ndWFnZSgpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCBkZXNjcmlwdG9yLmdldENvbnRlbnRMYW5ndWFnZSgpLmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4tVVMiLCBkZXNjcmlwdG9yLmdldENvbnRlbnRMYW5ndWFnZSgpLmdldCgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4tQ0EiLCBkZXNjcmlwdG9yLmdldENvbnRlbnRMYW5ndWFnZSgpLmdldCgyKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50TG9jYXRpb25SZWxhdGl2ZVVybCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXhpbWFsQm9keURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaWJlKEV4YW1wbGVNYWlsLk1VTFRJUEFSVF9XSVRIX0NPTlRFTlRfTE9DQVRJT05fQllURVMsIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlbGF0aXZlL3VybCIsIGRlc2NyaXB0b3IuZ2V0Q29udGVudExvY2F0aW9uKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudExvY2F0aW9uQWJzb2x1dGVVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWF4aW1hbEJvZHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkZXNjcmliZShFeGFtcGxlTWFpbC5NVUxUSVBBUlRfV0lUSF9DT05URU5UX0xPQ0FUSU9OX0JZVEVTLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd3d3LmV4YW1wbGUub3JnL2Fic29sdXRlL3JodWJhcmQudHh0IiwgZGVzY3JpcHRvci5nZXRDb250ZW50TG9jYXRpb24oKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50TG9jYXRpb25XaXRoQ29tbWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXhpbWFsQm9keURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaWJlKEV4YW1wbGVNYWlsLk1VTFRJUEFSVF9XSVRIX0NPTlRFTlRfTE9DQVRJT05fQllURVMsIDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvYWJzb2x1dGUvY29tbWVudHMvcmh1YmFyZC50eHQiLCBkZXNjcmlwdG9yLmdldENvbnRlbnRMb2NhdGlvbigpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRMb2NhdGlvbkZvbGRlZFVybCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXhpbWFsQm9keURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaWJlKEV4YW1wbGVNYWlsLk1VTFRJUEFSVF9XSVRIX0NPTlRFTlRfTE9DQVRJT05fQllURVMsIDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvdGhpcy9pcy9hL3ZlcnkvbG9uZy91cmwvc3BsaXQvb3Zlci90d28vbGluZXMvIiwgZGVzY3JpcHRvci5nZXRDb250ZW50TG9jYXRpb24oKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50TUQ1VXJsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1heGltYWxCb2R5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpYmUoRXhhbXBsZU1haWwuT05FX1BBUlRfTUlNRV9XSVRIX0NPTlRFTlRfRElTUE9TSVRJT05fUEFSQU1FVEVSU19CWVRFUyk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGFtcGxlTWFpbC5NRDVfQ09OVEVOVCwgZGVzY3JpcHRvci5nZXRDb250ZW50TUQ1UmF3KCkpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1heGltYWxCb2R5RGVzY3JpcHRvciBkZXNjcmliZShieXRlW10gbWFpbCwgaW50IHplcm9CYXNlZFBhcnQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaWFzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1haWwpOworICAgICAgICBwYXJzZXIucGFyc2UoYmlhcyk7CisgICAgICAgIGludCBzdGF0ZSA9IHBhcnNlci5uZXh0KCk7CisgICAgICAgIHdoaWxlIChzdGF0ZSAhPSBNaW1lVG9rZW5TdHJlYW0uVF9FTkRfT0ZfU1RSRUFNICYmIHplcm9CYXNlZFBhcnQ+PTApIHsKKyAgICAgICAgICAgIHN0YXRlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKSB7CisgICAgICAgICAgICAgICAgLS16ZXJvQmFzZWRQYXJ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZLCBzdGF0ZSk7CisgICAgICAgIEJvZHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBwYXJzZXIuZ2V0Qm9keURlc2NyaXB0b3IoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdG9yKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUGFyc2VyIGlzIG1heGltYWwgc28gYm9keSBkZXNjcmlwdG9yIHNob3VsZCBiZSBtYXhpbWFsIiwgZGVzY3JpcHRvciBpbnN0YW5jZW9mIE1heGltYWxCb2R5RGVzY3JpcHRvcik7CisgICAgICAgIHJldHVybiAoTWF4aW1hbEJvZHlEZXNjcmlwdG9yKSBkZXNjcmlwdG9yOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1heGltYWxCb2R5RGVzY3JpcHRvciBkZXNjcmliZShieXRlW10gbWFpbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpYXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obWFpbCk7CisgICAgICAgIHBhcnNlci5wYXJzZShiaWFzKTsKKyAgICAgICAgaW50IHN0YXRlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgd2hpbGUgKHN0YXRlICE9IE1pbWVUb2tlblN0cmVhbS5UX0JPRFkgJiYgc3RhdGUgIT0gTWltZVRva2VuU3RyZWFtLlRfRU5EX09GX1NUUkVBTSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlID0gcGFyc2VyLm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLlRfQk9EWSwgc3RhdGUpOworICAgICAgICBCb2R5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcGFyc2VyLmdldEJvZHlEZXNjcmlwdG9yKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGVzY3JpcHRvcik7CisgICAgICAgIGFzc2VydFRydWUoIlBhcnNlciBpcyBtYXhpbWFsIHNvIGJvZHkgZGVzY3JpcHRvciBzaG91bGQgYmUgbWF4aW1hbCIsIGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBNYXhpbWFsQm9keURlc2NyaXB0b3IpOworICAgICAgICByZXR1cm4gKE1heGltYWxCb2R5RGVzY3JpcHRvcikgZGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTXV0YWJsZUJvZHlEZXNjcmlwdG9yIG5ld0JvZHlEZXNjcmlwdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IE1heGltYWxCb2R5RGVzY3JpcHRvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBNdXRhYmxlQm9keURlc2NyaXB0b3IgbmV3Qm9keURlc2NyaXB0b3IoQm9keURlc2NyaXB0b3IgcGFyZW50KSB7CisgICAgICAgIHJldHVybiBuZXcgTWF4aW1hbEJvZHlEZXNjcmlwdG9yKHBhcmVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9Db250ZW50RGlzcG9zaXRpb25GaWVsZFRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvQ29udGVudERpc3Bvc2l0aW9uRmllbGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiNDVkMAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvQ29udGVudERpc3Bvc2l0aW9uRmllbGRUZXN0LmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkOw0KKw0KK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOw0KKw0KK3B1YmxpYyBjbGFzcyBDb250ZW50RGlzcG9zaXRpb25GaWVsZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCisgICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLnJlc2V0Q29uZmlndXJhdGlvbigpOw0KKyAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdERpc3Bvc2l0aW9uVHlwZVdpdGhTZW1pQ29sb25Ob1BhcmFtcygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgZiA9IG51bGw7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmxpbmUiLCBmLmdldERpc3Bvc2l0aW9uVHlwZSgpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzcG9zaXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZCBmID0gbnVsbDsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImF0dGFjaG1lbnQiLCBmLmdldERpc3Bvc2l0aW9uVHlwZSgpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJjb250ZW50LWRpc3Bvc2l0aW9uOiAgIEluTGlOZSAgICIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmxpbmUiLCBmLmdldERpc3Bvc2l0aW9uVHlwZSgpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDT05URU5ULURJU1BPU0lUSU9OOiAgIHgteWFkYSA7IiArICIgIHBhcmFtID0geWFkYSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4LXlhZGEiLCBmLmdldERpc3Bvc2l0aW9uVHlwZSgpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQucGFyc2UoIkNPTlRFTlQtRElTUE9TSVRJT046ICAgIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGYuZ2V0RGlzcG9zaXRpb25UeXBlKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGYgPSBudWxsOw0KKw0KKyAgICAgICAgZiA9IChDb250ZW50RGlzcG9zaXRpb25GaWVsZCkgQWJzdHJhY3RGaWVsZA0KKyAgICAgICAgICAgICAgICAucGFyc2UoIkNPTlRFTlQtRElTUE9TSVRJT046ICAgaW5saW5lIDsiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBmaWxlbmFtZT15YWRhIHlhZGEiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieWFkYSIsIGYuZ2V0UGFyYW1ldGVyKCJmaWxlbmFtZSIpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiB4LXlhZGE7Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgZmlsZU5BbWU9IFwieWE6XFxcIipkYVwiOyAiICsgIlx0U0laRVx0ID0gIDEyMzQiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieWE6XCIqZGEiLCBmLmdldFBhcmFtZXRlcigiZmlsZW5hbWUiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMzQiLCBmLmdldFBhcmFtZXRlcigic2l6ZSIpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiB4LXlhZGE7ICAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmlsZU5BbWU9IFwieWEgXFxcIlxcXCJcdGRhIFxcXCJcIjsgIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlx0eC1ZYWRhXHQgPSAgXCJcXFwiaGVwcFxcXCIgID11c1x0LWFzY2lpXCIiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieWEgXCJcIlx0ZGEgXCIiLCBmLmdldFBhcmFtZXRlcigiZmlsZW5hbWUiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlwiaGVwcFwiICA9dXNcdC1hc2NpaSIsIGYuZ2V0UGFyYW1ldGVyKCJ4LXlhZGEiKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdElzRGlzcG9zaXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZCBmID0gbnVsbDsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtRGlzcG9zaXRpb246SU5saW5lIik7DQorICAgICAgICBhc3NlcnRUcnVlKGYuaXNEaXNwb3NpdGlvblR5cGUoIkluTGlOZSIpKTsNCisgICAgICAgIGFzc2VydEZhbHNlKGYuaXNEaXNwb3NpdGlvblR5cGUoIk5pTGlOZSIpKTsNCisgICAgICAgIGFzc2VydFRydWUoZi5pc0lubGluZSgpKTsNCisgICAgICAgIGFzc2VydEZhbHNlKGYuaXNBdHRhY2htZW50KCkpOw0KKw0KKyAgICAgICAgZiA9IChDb250ZW50RGlzcG9zaXRpb25GaWVsZCkgQWJzdHJhY3RGaWVsZA0KKyAgICAgICAgICAgICAgICAucGFyc2UoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQiKTsNCisgICAgICAgIGFzc2VydFRydWUoZi5pc0Rpc3Bvc2l0aW9uVHlwZSgiQVRUQUNITUVOVCIpKTsNCisgICAgICAgIGFzc2VydEZhbHNlKGYuaXNJbmxpbmUoKSk7DQorICAgICAgICBhc3NlcnRUcnVlKGYuaXNBdHRhY2htZW50KCkpOw0KKw0KKyAgICAgICAgZiA9IChDb250ZW50RGlzcG9zaXRpb25GaWVsZCkgQWJzdHJhY3RGaWVsZA0KKyAgICAgICAgICAgICAgICAucGFyc2UoIkNvbnRlbnQtRGlzcG9zaXRpb246IHgtc29tZXRoaW5nIik7DQorICAgICAgICBhc3NlcnRUcnVlKGYuaXNEaXNwb3NpdGlvblR5cGUoIngtU29tZVRoaW5nIikpOw0KKyAgICAgICAgYXNzZXJ0RmFsc2UoZi5pc0lubGluZSgpKTsNCisgICAgICAgIGFzc2VydEZhbHNlKGYuaXNBdHRhY2htZW50KCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWxlbmFtZSgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgZiA9IG51bGw7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT15YWRhLnR4dCIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ5YWRhLnR4dCIsIGYuZ2V0RmlsZW5hbWUoKSk7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT15YWRhIHlhZGEudHh0Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInlhZGEiLCBmLmdldEZpbGVuYW1lKCkpOw0KKw0KKyAgICAgICAgZiA9IChDb250ZW50RGlzcG9zaXRpb25GaWVsZCkgQWJzdHJhY3RGaWVsZA0KKyAgICAgICAgICAgICAgICAucGFyc2UoIkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9XCJ5YWRhIHlhZGEudHh0XCIiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieWFkYSB5YWRhLnR4dCIsIGYuZ2V0RmlsZW5hbWUoKSk7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lIik7DQorICAgICAgICBhc3NlcnROdWxsKGYuZ2V0RmlsZW5hbWUoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdEdldENyZWF0aW9uRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgZiA9IG51bGw7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiY3JlYXRpb24tZGF0ZT1cIlR1ZSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgKzAwMDBcIiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEYXRlKDApLCBmLmdldENyZWF0aW9uRGF0ZSgpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7ICINCisgICAgICAgICAgICAgICAgICAgICAgICArICJjcmVhdGlvbi1kYXRlPVR1ZSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgKzAwMDAiKTsNCisgICAgICAgIGFzc2VydE51bGwoZi5nZXRDcmVhdGlvbkRhdGUoKSk7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudCIpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChmLmdldENyZWF0aW9uRGF0ZSgpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kaWZpY2F0aW9uRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgZiA9IG51bGw7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAibW9kaWZpY2F0aW9uLWRhdGU9XCJUdWUsIDAxIEphbiAxOTcwIDAwOjAwOjAwICswMDAwXCIiKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRGF0ZSgwKSwgZi5nZXRNb2RpZmljYXRpb25EYXRlKCkpOw0KKw0KKyAgICAgICAgZiA9IChDb250ZW50RGlzcG9zaXRpb25GaWVsZCkgQWJzdHJhY3RGaWVsZA0KKyAgICAgICAgICAgICAgICAucGFyc2UoIkNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIm1vZGlmaWNhdGlvbi1kYXRlPVwiV2VkLCAxMiBGZWIgMTk5NyAxNjoyOTo1MSAtMDUwMFwiIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERhdGUoODU1NzgyOTkxMDAwbCksIGYuZ2V0TW9kaWZpY2F0aW9uRGF0ZSgpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7ICINCisgICAgICAgICAgICAgICAgICAgICAgICArICJtb2RpZmljYXRpb24tZGF0ZT15ZXN0ZXJkYXkiKTsNCisgICAgICAgIGFzc2VydE51bGwoZi5nZXRNb2RpZmljYXRpb25EYXRlKCkpOw0KKw0KKyAgICAgICAgZiA9IChDb250ZW50RGlzcG9zaXRpb25GaWVsZCkgQWJzdHJhY3RGaWVsZA0KKyAgICAgICAgICAgICAgICAucGFyc2UoIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQiKTsNCisgICAgICAgIGFzc2VydE51bGwoZi5nZXRNb2RpZmljYXRpb25EYXRlKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZWFkRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQ29udGVudERpc3Bvc2l0aW9uRmllbGQgZiA9IG51bGw7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyAiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVhZC1kYXRlPVwiVHVlLCAwMSBKYW4gMTk3MCAwMDowMDowMCArMDAwMFwiIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERhdGUoMCksIGYuZ2V0UmVhZERhdGUoKSk7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyByZWFkLWRhdGU9Iik7DQorICAgICAgICBhc3NlcnROdWxsKGYuZ2V0UmVhZERhdGUoKSk7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudCIpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChmLmdldFJlYWREYXRlKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZCBmID0gbnVsbDsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBzaXplPTAiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygwLCBmLmdldFNpemUoKSk7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgc2l6ZT1tYXR0ZXJzIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGYuZ2V0U2l6ZSgpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGYuZ2V0U2l6ZSgpKTsNCisNCisgICAgICAgIGYgPSAoQ29udGVudERpc3Bvc2l0aW9uRmllbGQpIEFic3RyYWN0RmllbGQNCisgICAgICAgICAgICAgICAgLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBzaXplPS0xMiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBmLmdldFNpemUoKSk7DQorDQorICAgICAgICBmID0gKENvbnRlbnREaXNwb3NpdGlvbkZpZWxkKSBBYnN0cmFjdEZpZWxkDQorICAgICAgICAgICAgICAgIC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgc2l6ZT0xMiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyLCBmLmdldFNpemUoKSk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9Db250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9Db250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOTdjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0NvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGRUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkNvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQ7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkFic3RyYWN0RmllbGQ7DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZCBmID0gbnVsbDsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IChDb250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkKSANCisgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiOGJpdCIsIGYuZ2V0RW5jb2RpbmcoKSk7DQorICAgICAgICANCisgICAgICAgIGYgPSAoQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZCkgDQorICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAgICBCYVNFNjQgICAiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiYmFzZTY0IiwgZi5nZXRFbmNvZGluZygpKTsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IChDb250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkKSANCisgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICAgICAgICIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBmLmdldEVuY29kaW5nKCkpOw0KKyAgICAgICAgDQorICAgICAgICBmID0gKENvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQpIA0KKyAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzoiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZi5nZXRFbmNvZGluZygpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEdldEVuY29kaW5nU3RhdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBDb250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkIGYgPSBudWxsOw0KKyAgICAgICAgDQorICAgICAgICBmID0gKENvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQpIA0KKyAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdCIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4Yml0IiwgQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZC5nZXRFbmNvZGluZyhmKSk7DQorICAgICAgICANCisgICAgICAgIGYgPSBudWxsOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI3Yml0IiwgQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZC5nZXRFbmNvZGluZyhmKSk7DQorICAgICAgICANCisgICAgICAgIGYgPSAoQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZCkgDQorICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAgICAgICAiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiN2JpdCIsIENvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQuZ2V0RW5jb2RpbmcoZikpOw0KKyAgICAgICAgDQorICAgICAgICBmID0gKENvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQpIA0KKyAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzoiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiN2JpdCIsIENvbnRlbnRUcmFuc2ZlckVuY29kaW5nRmllbGQuZ2V0RW5jb2RpbmcoZikpOw0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvQ29udGVudFR5cGVGaWVsZFRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvQ29udGVudFR5cGVGaWVsZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWViMTkzCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9Db250ZW50VHlwZUZpZWxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQ29udGVudFR5cGVGaWVsZDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQWJzdHJhY3RGaWVsZDsNCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KK3B1YmxpYyBjbGFzcyBDb250ZW50VHlwZUZpZWxkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisgICAgQE92ZXJyaWRlDQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgew0KKyAgICAgICAgQmFzaWNDb25maWd1cmF0b3IucmVzZXRDb25maWd1cmF0aW9uKCk7DQorICAgICAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdE1pbWVUeXBlV2l0aFNlbWlDb2xvbk5vUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiAgew0KKyAgICAgICAgQ29udGVudFR5cGVGaWVsZCBmID0gbnVsbDsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IChDb250ZW50VHlwZUZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVR5cGU6IHRleHQvaHRtbDsiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9odG1sIiwgZi5nZXRNaW1lVHlwZSgpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1pbWVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBDb250ZW50VHlwZUZpZWxkIGYgPSBudWxsOw0KKyAgICAgICAgDQorICAgICAgICBmID0gKENvbnRlbnRUeXBlRmllbGQpIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHlwZTogdGV4dC9QTEFJTiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgZi5nZXRNaW1lVHlwZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IChDb250ZW50VHlwZUZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJjb250ZW50LXR5cGU6ICAgVGVYdCAvIGh0bWwgICAiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9odG1sIiwgZi5nZXRNaW1lVHlwZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IChDb250ZW50VHlwZUZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDT05URU5ULVRZUEU6ICAgeC1hcHAveWFkYSA7Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIHBhcmFtID0geWFkYSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4LWFwcC95YWRhIiwgZi5nZXRNaW1lVHlwZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IChDb250ZW50VHlwZUZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDT05URU5ULVRZUEU6ICAgeWFkYSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBmLmdldE1pbWVUeXBlKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWltZVR5cGVTdGF0aWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIENvbnRlbnRUeXBlRmllbGQgY2hpbGQgPSBudWxsOw0KKyAgICAgICAgQ29udGVudFR5cGVGaWVsZCBwYXJlbnQgPSBudWxsOw0KKyAgICAgICAgDQorICAgICAgICBjaGlsZCA9IChDb250ZW50VHlwZUZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVR5cGU6IGNoaWxkL3R5cGUiKTsNCisgICAgICAgIHBhcmVudCA9IChDb250ZW50VHlwZUZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVR5cGU6IHBhcmVudC90eXBlIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkL3R5cGUiLCBDb250ZW50VHlwZUZpZWxkLmdldE1pbWVUeXBlKGNoaWxkLCBwYXJlbnQpKTsNCisgICAgICAgIA0KKyAgICAgICAgY2hpbGQgPSBudWxsOw0KKyAgICAgICAgcGFyZW50ID0gKENvbnRlbnRUeXBlRmllbGQpIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHlwZTogcGFyZW50L3R5cGUiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIENvbnRlbnRUeXBlRmllbGQuZ2V0TWltZVR5cGUoY2hpbGQsIHBhcmVudCkpOw0KKyAgICAgICAgcGFyZW50ID0gKENvbnRlbnRUeXBlRmllbGQpIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdCIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXNzYWdlL3JmYzgyMiIsIENvbnRlbnRUeXBlRmllbGQuZ2V0TWltZVR5cGUoY2hpbGQsIHBhcmVudCkpOw0KKyAgICAgICAgDQorICAgICAgICBjaGlsZCA9IChDb250ZW50VHlwZUZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVR5cGU6Iik7DQorICAgICAgICBwYXJlbnQgPSAoQ29udGVudFR5cGVGaWVsZCkgQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UeXBlOiBwYXJlbnQvdHlwZSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgQ29udGVudFR5cGVGaWVsZC5nZXRNaW1lVHlwZShjaGlsZCwgcGFyZW50KSk7DQorICAgICAgICBwYXJlbnQgPSAoQ29udGVudFR5cGVGaWVsZCkgQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIm1lc3NhZ2UvcmZjODIyIiwgQ29udGVudFR5cGVGaWVsZC5nZXRNaW1lVHlwZShjaGlsZCwgcGFyZW50KSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyc2V0U3RhdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBDb250ZW50VHlwZUZpZWxkIGYgPSBudWxsOw0KKyAgICAgICAgDQorICAgICAgICBmID0gKENvbnRlbnRUeXBlRmllbGQpIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHlwZTogc29tZS90eXBlOyBjaGFyc2V0PWlzbzg4NTktMSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpc284ODU5LTEiLCBDb250ZW50VHlwZUZpZWxkLmdldENoYXJzZXQoZikpOw0KKyAgICAgICAgDQorICAgICAgICBmID0gKENvbnRlbnRUeXBlRmllbGQpIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHlwZTogc29tZS90eXBlOyIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cy1hc2NpaSIsIENvbnRlbnRUeXBlRmllbGQuZ2V0Q2hhcnNldChmKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIENvbnRlbnRUeXBlRmllbGQgZiA9IG51bGw7DQorICAgICAgICANCisgICAgICAgIGYgPSAoQ29udGVudFR5cGVGaWVsZCkgQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ09OVEVOVC1UWVBFOiAgIHRleHQgLyBodG1sIDsiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBib3VuZGFyeT15YWRhIHlhZGEiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieWFkYSIsIGYuZ2V0UGFyYW1ldGVyKCJib3VuZGFyeSIpKTsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IChDb250ZW50VHlwZUZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVR5cGU6IHgtYXBwL3lhZGE7Ig0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgYm9VTmRhclk9IFwieWE6XFxcIipkYVwiOyAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXHRjaGFyc2V0XHQgPSAgdXMtYXNjaWkiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieWE6XCIqZGEiLCBmLmdldFBhcmFtZXRlcigiYm91bmRhcnkiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInVzLWFzY2lpIiwgZi5nZXRQYXJhbWV0ZXIoImNoYXJzZXQiKSk7DQorICAgICAgICANCisgICAgICAgIGYgPSAoQ29udGVudFR5cGVGaWVsZCkgQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UeXBlOiB4LWFwcC95YWRhOyAgIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJib1VOZGFyWT0gXCJ5YSBcXFwiXFxcIlx0ZGEgXFxcIlwiOyAiDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlx0Y2hhcnNldFx0ID0gIFwiXFxcImhlcHBcXFwiICA9dXNcdC1hc2NpaVwiIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInlhIFwiXCJcdGRhIFwiIiwgZi5nZXRQYXJhbWV0ZXIoImJvdW5kYXJ5IikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcImhlcHBcIiAgPXVzXHQtYXNjaWkiLCBmLmdldFBhcmFtZXRlcigiY2hhcnNldCIpKTsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0ZpZWxkVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9GaWVsZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmVhNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9GaWVsZFRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZDsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQ29udGVudFR5cGVGaWVsZDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQWJzdHJhY3RGaWVsZDsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuVW5zdHJ1Y3R1cmVkRmllbGQ7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5GaWVsZDsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KK3B1YmxpYyBjbGFzcyBGaWVsZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBGaWVsZCBmID0gbnVsbDsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IEFic3RyYWN0RmllbGQucGFyc2UoIlN1YmplY3Q6IFlhZGEgeWFkYSB5YWRhIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3Rpbmcgc2ltcGxlIGZpZWxkIiwgIlN1YmplY3QiLCBmLmdldE5hbWUoKSk7DQorICAgICAgICANCisgICAgICAgIGYgPSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJYLXlhZGEteWFkYTogWWFkYSB5YWRhIHlhZGEiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiVGVzdGluZyBhbiBYLSBmaWVsZCIsICJYLXlhZGEteWFkYSIsIGYuZ2V0TmFtZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBmID0gQWJzdHJhY3RGaWVsZC5wYXJzZSgiWWFkYSB5YWRhIHlhZGEiKTsNCisgICAgICAgICAgICBmYWlsKCJNaW1lRXhjZXB0aW9uIG5vdCB0aHJvd24gd2hlbiB1c2luZyBhbiBpbnZhbGlkIGZpZWxkIik7DQorICAgICAgICB9IGNhdGNoIChNaW1lRXhjZXB0aW9uIGUpIHsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIEZpZWxkIGYgPSBudWxsOw0KKyAgICAgICAgDQorICAgICAgICBmID0gQWJzdHJhY3RGaWVsZC5wYXJzZSgiU3ViamVjdDogWWFkYSB5YWRhIHlhZGEiKTsNCisgICAgICAgIGFzc2VydFRydWUoIkZpZWxkIHNob3VsZCBiZSBVbnN0cnVjdHVyZWRGaWVsZCIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYgaW5zdGFuY2VvZiBVbnN0cnVjdHVyZWRGaWVsZCk7DQorICAgICAgICBmID0gQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIik7DQorICAgICAgICBhc3NlcnRUcnVlKCJGaWVsZCBzaG91bGQgYmUgQ29udGVudFR5cGVGaWVsZCIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYgaW5zdGFuY2VvZiBDb250ZW50VHlwZUZpZWxkKTsNCisgICAgICAgIGYgPSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0Iik7DQorICAgICAgICBhc3NlcnRUcnVlKCJGaWVsZCBzaG91bGQgYmUgQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZCIsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgIGYgaW5zdGFuY2VvZiBDb250ZW50VHJhbnNmZXJFbmNvZGluZ0ZpZWxkKTsNCisgICAgfQ0KKyAgICANCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9GaWVsZHNUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL0ZpZWxkc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTI4NmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9GaWVsZHNUZXN0LmphdmEKQEAgLTAsMCArMSwzODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5Hcm91cDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5hZGRyZXNzLk1haWxib3g7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZVNlcXVlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ29udGVudFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5NaW1lVXRpbDsKKworcHVibGljIGNsYXNzIEZpZWxkc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudFR5cGVTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGVudFR5cGVGaWVsZCBmaWVsZCA9IEZpZWxkcy5jb250ZW50VHlwZSgibXVsdGlwYXJ0L21peGVkOyAiCisgICAgICAgICAgICAgICAgKyAiYm91bmRhcnk9XCItPVBhcnQuMC4zNzg3Nzk2OGRkNGY2NTk1LjExZWNjZjAyNzFjIgorICAgICAgICAgICAgICAgICsgIi4yZGNlNTY3OGNiYzkzM2Q1PS1cIiIpOworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkLmlzVmFsaWRGaWVsZCgpKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRSYXcgPSAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7XHJcbiAiCisgICAgICAgICAgICAgICAgKyAiYm91bmRhcnk9XCItPVBhcnQuMC4zNzg3Nzk2OGRkNGY2NTk1LjExZWNjZjAyNzFjIgorICAgICAgICAgICAgICAgICsgIi4yZGNlNTY3OGNiYzkzM2Q1PS1cIiI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJhdywgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRUeXBlU3RyaW5nUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgcGFyYW1ldGVycy5wdXQoImJvdW5kYXJ5IiwKKyAgICAgICAgICAgICAgICAiLT1QYXJ0LjAuMzc4Nzc5NjhkZDRmNjU5NS4xMWVjY2YwMjcxYy4yZGNlNTY3OGNiYzkzM2Q1PS0iKTsKKyAgICAgICAgQ29udGVudFR5cGVGaWVsZCBmaWVsZCA9IEZpZWxkcy5jb250ZW50VHlwZSgibXVsdGlwYXJ0L21peGVkIiwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWVsZC5pc1ZhbGlkRmllbGQoKSk7CisKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmF3ID0gIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO1xyXG4gIgorICAgICAgICAgICAgICAgICsgImJvdW5kYXJ5PVwiLT1QYXJ0LjAuMzc4Nzc5NjhkZDRmNjU5NS4xMWVjY2YwMjcxYyIKKyAgICAgICAgICAgICAgICArICIuMmRjZTU2NzhjYmM5MzNkNT0tXCIiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSYXcsIGRlY29kZShmaWVsZC5nZXRSYXcoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50VHlwZVN0cmluZ1BhcmFtZXRlcnNXaXRoU3BhY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBwYXJhbWV0ZXJzLnB1dCgicGFyYW0iLCAidmFsdWUgd2l0aCBzcGFjZSBjaGFycyIpOworICAgICAgICBDb250ZW50VHlwZUZpZWxkIGZpZWxkID0gRmllbGRzLmNvbnRlbnRUeXBlKCJtdWx0aXBhcnQvbWl4ZWQiLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkLmlzVmFsaWRGaWVsZCgpKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRSYXcgPSAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7ICIKKyAgICAgICAgICAgICAgICArICJwYXJhbT1cInZhbHVlIHdpdGggc3BhY2UgY2hhcnNcIiI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJhdywgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRUeXBlU3RyaW5nTnVsbFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGVudFR5cGVGaWVsZCBmaWVsZCA9IEZpZWxkcy5jb250ZW50VHlwZSgidGV4dC9wbGFpbiIsIG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkLmlzVmFsaWRGaWVsZCgpKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRSYXcgPSAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmF3LCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRlbnRUeXBlRmllbGQgZmllbGQgPSBGaWVsZHMuY29udGVudFR5cGUoIm11bHRpcGFydC9taXhlZDsgIgorICAgICAgICAgICAgICAgICsgImJvdW5kYXJ5PS09UGFydC4wLjM3ODc3OTY4ZGQ0ZjY1OTUuMTFlY2NmMDI3MWMiCisgICAgICAgICAgICAgICAgKyAiLjJkY2U1Njc4Y2JjOTMzZDU9LSIpOworICAgICAgICBhc3NlcnRGYWxzZShmaWVsZC5pc1ZhbGlkRmllbGQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtdWx0aXBhcnQvbWl4ZWQiLCBmaWVsZC5nZXRNaW1lVHlwZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudFRyYW5zZmVyRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGVudFRyYW5zZmVyRW5jb2RpbmdGaWVsZCBmaWVsZCA9IEZpZWxkcworICAgICAgICAgICAgICAgIC5jb250ZW50VHJhbnNmZXJFbmNvZGluZygiYmFzZTY0Iik7CisgICAgICAgIGFzc2VydFRydWUoZmllbGQuaXNWYWxpZEZpZWxkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0IiwKKyAgICAgICAgICAgICAgICBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudERpc3Bvc2l0aW9uU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGZpZWxkID0gRmllbGRzLmNvbnRlbnREaXNwb3NpdGlvbigiaW5saW5lOyAiCisgICAgICAgICAgICAgICAgKyAiZmlsZW5hbWU9XCJ0ZXN0aW5nIDEgMi5kYXRcIjsgc2l6ZT0xMjM0NTsgIgorICAgICAgICAgICAgICAgICsgImNyZWF0aW9uLWRhdGU9XCJUaHUsIDEgSmFuIDE5NzAgMDA6MDA6MDAgKzAwMDBcIiIpOworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkLmlzVmFsaWRGaWVsZCgpKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRSYXcgPSAiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iCisgICAgICAgICAgICAgICAgKyAiXCJ0ZXN0aW5nIDEgMi5kYXRcIjsgc2l6ZT0xMjM0NTtcclxuIGNyZWF0aW9uLWRhdGU9IgorICAgICAgICAgICAgICAgICsgIlwiVGh1LCAxIEphbiAxOTcwIDAwOjAwOjAwICswMDAwXCIiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSYXcsIGRlY29kZShmaWVsZC5nZXRSYXcoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50RGlzcG9zaXRpb25TdHJpbmdQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBwYXJhbWV0ZXJzLnB1dCgiY3JlYXRpb24tZGF0ZSIsIE1pbWVVdGlsLmZvcm1hdERhdGUobmV3IERhdGUoMCksCisgICAgICAgICAgICAgICAgVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIpKSk7CisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGZpZWxkID0gRmllbGRzLmNvbnRlbnREaXNwb3NpdGlvbigiYXR0YWNobWVudCIsCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycyk7CisgICAgICAgIGFzc2VydFRydWUoZmllbGQuaXNWYWxpZEZpZWxkKCkpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZFJhdyA9ICJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyAiCisgICAgICAgICAgICAgICAgKyAiY3JlYXRpb24tZGF0ZT1cIlRodSwgMSBKYW4gMTk3MCAwMDowMDowMFxyXG4gKzAwMDBcIiI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJhdywgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEYXRlKDApLCBmaWVsZC5nZXRDcmVhdGlvbkRhdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnREaXNwb3NpdGlvblN0cmluZ051bGxQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGZpZWxkID0gRmllbGRzLmNvbnRlbnREaXNwb3NpdGlvbigiaW5saW5lIiwKKyAgICAgICAgICAgICAgICAoTWFwPFN0cmluZywgU3RyaW5nPikgbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUoZmllbGQuaXNWYWxpZEZpZWxkKCkpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZFJhdyA9ICJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSYXcsIGRlY29kZShmaWVsZC5nZXRSYXcoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50RGlzcG9zaXRpb25GaWxlbmFtZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZCBmaWVsZCA9IEZpZWxkcy5jb250ZW50RGlzcG9zaXRpb24oImF0dGFjaG1lbnQiLAorICAgICAgICAgICAgICAgICJzb21lIGZpbGUuZGF0Iik7CisgICAgICAgIGFzc2VydFRydWUoZmllbGQuaXNWYWxpZEZpZWxkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiYXR0YWNobWVudCIsIGZpZWxkLmdldERpc3Bvc2l0aW9uVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb21lIGZpbGUuZGF0IiwgZmllbGQuZ2V0RmlsZW5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnREaXNwb3NpdGlvbkZpbGVuYW1lU2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZCBmaWVsZCA9IEZpZWxkcy5jb250ZW50RGlzcG9zaXRpb24oImF0dGFjaG1lbnQiLAorICAgICAgICAgICAgICAgICJzb21lIGZpbGUuZGF0IiwgMzAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShmaWVsZC5pc1ZhbGlkRmllbGQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRhY2htZW50IiwgZmllbGQuZ2V0RGlzcG9zaXRpb25UeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNvbWUgZmlsZS5kYXQiLCBmaWVsZC5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMwMCwgZmllbGQuZ2V0U2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudERpc3Bvc2l0aW9uRmlsZW5hbWVTaXplRGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250ZW50RGlzcG9zaXRpb25GaWVsZCBmaWVsZCA9IEZpZWxkcy5jb250ZW50RGlzcG9zaXRpb24oImF0dGFjaG1lbnQiLAorICAgICAgICAgICAgICAgICJzb21lIGZpbGUuZGF0IiwgMzAwLCBuZXcgRGF0ZSgxMDAwKSwgbmV3IERhdGUoMjAwMCksIG5ldyBEYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgMzAwMCkpOworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkLmlzVmFsaWRGaWVsZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImF0dGFjaG1lbnQiLCBmaWVsZC5nZXREaXNwb3NpdGlvblR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic29tZSBmaWxlLmRhdCIsIGZpZWxkLmdldEZpbGVuYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzAwLCBmaWVsZC5nZXRTaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERhdGUoMTAwMCksIGZpZWxkLmdldENyZWF0aW9uRGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEYXRlKDIwMDApLCBmaWVsZC5nZXRNb2RpZmljYXRpb25EYXRlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERhdGUoMzAwMCksIGZpZWxkLmdldFJlYWREYXRlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ29udGVudERpc3Bvc2l0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbkZpZWxkIGZpZWxkID0gRmllbGRzLmNvbnRlbnREaXNwb3NpdGlvbigiaW5saW5lOyAiCisgICAgICAgICAgICAgICAgKyAiZmlsZW5hbWU9c29tZSBmaWxlLmRhdCIpOworICAgICAgICBhc3NlcnRGYWxzZShmaWVsZC5pc1ZhbGlkRmllbGQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmxpbmUiLCBmaWVsZC5nZXREaXNwb3NpdGlvblR5cGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERhdGVTdHJpbmdEYXRlVGltZVpvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRGF0ZVRpbWVGaWVsZCBmaWVsZCA9IEZpZWxkcy5kYXRlKCJEYXRlIiwgbmV3IERhdGUoMCksIFRpbWVab25lCisgICAgICAgICAgICAgICAgLmdldFRpbWVab25lKCJHTVQiKSk7CisgICAgICAgIGFzc2VydFRydWUoZmllbGQuaXNWYWxpZEZpZWxkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiRGF0ZTogVGh1LCAxIEphbiAxOTcwIDAwOjAwOjAwICswMDAwIiwgZGVjb2RlKGZpZWxkCisgICAgICAgICAgICAgICAgLmdldFJhdygpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRGF0ZSgwKSwgZmllbGQuZ2V0RGF0ZSgpKTsKKworICAgICAgICBmaWVsZCA9IEZpZWxkcy5kYXRlKCJSZXNlbnQtRGF0ZSIsIG5ldyBEYXRlKDApLCBUaW1lWm9uZQorICAgICAgICAgICAgICAgIC5nZXRUaW1lWm9uZSgiR01UKzEiKSk7CisgICAgICAgIGFzc2VydFRydWUoZmllbGQuaXNWYWxpZEZpZWxkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiUmVzZW50LURhdGU6IFRodSwgMSBKYW4gMTk3MCAwMTowMDowMCArMDEwMCIsCisgICAgICAgICAgICAgICAgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRGF0ZSgwKSwgZmllbGQuZ2V0RGF0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZURTVCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBsb25nIG1pbGxpcyA9IDEyMTYyMjExNTMwMDBsOworICAgICAgICBEYXRlVGltZUZpZWxkIGZpZWxkID0gRmllbGRzLmRhdGUoIkRhdGUiLCBuZXcgRGF0ZShtaWxsaXMpLCBUaW1lWm9uZQorICAgICAgICAgICAgICAgIC5nZXRUaW1lWm9uZSgiQ0VUIikpOworICAgICAgICBhc3NlcnRUcnVlKGZpZWxkLmlzVmFsaWRGaWVsZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkRhdGU6IFdlZCwgMTYgSnVsIDIwMDggMTc6MTI6MzMgKzAyMDAiLCBkZWNvZGUoZmllbGQKKyAgICAgICAgICAgICAgICAuZ2V0UmF3KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEYXRlKG1pbGxpcyksIGZpZWxkLmdldERhdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VJZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGaWVsZCBtZXNzYWdlSWQgPSBGaWVsZHMubWVzc2FnZUlkKCJhY21lLm9yZyIpOworCisgICAgICAgIFN0cmluZyByYXcgPSBDb250ZW50VXRpbC5kZWNvZGUobWVzc2FnZUlkLmdldFJhdygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyYXcuc3RhcnRzV2l0aCgiTWVzc2FnZS1JRDogPE1pbWU0ai4iKSk7CisgICAgICAgIGFzc2VydFRydWUocmF3LmVuZHNXaXRoKCJAYWNtZS5vcmc+IikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiU3ViamVjdDogIiwgZGVjb2RlKEZpZWxkcy5zdWJqZWN0KCIiKS5nZXRSYXcoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN1YmplY3Q6IHRlc3QiLCBkZWNvZGUoRmllbGRzLnN1YmplY3QoInRlc3QiKS5nZXRSYXcoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlN1YmplY3Q6ID0/SVNPLTg4NTktMT9RP1NtPUY4cmVicj1GOGQ/PSIsIGRlY29kZShGaWVsZHMKKyAgICAgICAgICAgICAgICAuc3ViamVjdCgiU21cMzcwcmViclwzNzBkIikuZ2V0UmF3KCkpKTsKKworICAgICAgICBTdHJpbmcgc2V2ZW50eUVpZ2h0ID0gIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdWJqZWN0OlxyXG4gIiArIHNldmVudHlFaWdodCwgZGVjb2RlKEZpZWxkcy5zdWJqZWN0KAorICAgICAgICAgICAgICAgIHNldmVudHlFaWdodCkuZ2V0UmF3KCkpKTsKKworICAgICAgICBTdHJpbmcgc2V2ZW50eU5pbmUgPSBzZXZlbnR5RWlnaHQgKyAiOSI7CisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJTdWJqZWN0OiA9P1VTLUFTQ0lJP1E/MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzND89IgorICAgICAgICAgICAgICAgICsgIlxyXG4gPT9VUy1BU0NJST9RPzU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5Pz0iOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGRlY29kZShGaWVsZHMuc3ViamVjdChzZXZlbnR5TmluZSkuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1haWxib3hGaWVsZCBmaWVsZCA9IEZpZWxkcy5zZW5kZXIoTWFpbGJveAorICAgICAgICAgICAgICAgIC5wYXJzZSgiSkQgPGpvaG4uZG9lQGFjbWUub3JnPiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZW5kZXI6IEpEIDxqb2huLmRvZUBhY21lLm9yZz4iLCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYWlsYm94IG1haWxib3gxID0gTWFpbGJveC5wYXJzZSgiSkQgPGpvaG4uZG9lQGFjbWUub3JnPiIpOworICAgICAgICBNYWlsYm94IG1haWxib3gyID0gTWFpbGJveC5wYXJzZSgiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iKTsKKworICAgICAgICBNYWlsYm94TGlzdEZpZWxkIGZpZWxkID0gRmllbGRzLmZyb20obWFpbGJveDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb206IEpEIDxqb2huLmRvZUBhY21lLm9yZz4iLCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKworICAgICAgICBmaWVsZCA9IEZpZWxkcy5mcm9tKG1haWxib3gxLCBtYWlsYm94Mik7CisgICAgICAgIGFzc2VydEVxdWFscygiRnJvbTogSkQgPGpvaG4uZG9lQGFjbWUub3JnPiwgIgorICAgICAgICAgICAgICAgICsgIk1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+IiwgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisKKyAgICAgICAgZmllbGQgPSBGaWVsZHMuZnJvbShBcnJheXMuYXNMaXN0KG1haWxib3gxLCBtYWlsYm94MikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb206IEpEIDxqb2huLmRvZUBhY21lLm9yZz4sICIKKyAgICAgICAgICAgICAgICArICJNYXJ5IFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiIsIGRlY29kZShmaWVsZC5nZXRSYXcoKSkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RUbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYWlsYm94IG1haWxib3gxID0gTWFpbGJveC5wYXJzZSgiSkQgPGpvaG4uZG9lQGFjbWUub3JnPiIpOworICAgICAgICBNYWlsYm94IG1haWxib3gyID0gTWFpbGJveC5wYXJzZSgiamFuZS5kb2VAZXhhbXBsZS5vcmciKTsKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MyA9IE1haWxib3gucGFyc2UoIk1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+Iik7CisgICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKCJUaGUgRG9lcyIsIG1haWxib3gxLCBtYWlsYm94Mik7CisKKyAgICAgICAgQWRkcmVzc0xpc3RGaWVsZCBmaWVsZCA9IEZpZWxkcy50byhncm91cCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVG86IFRoZSBEb2VzOiBKRCA8am9obi5kb2VAYWNtZS5vcmc+LCAiCisgICAgICAgICAgICAgICAgKyAiamFuZS5kb2VAZXhhbXBsZS5vcmc7IiwgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisKKyAgICAgICAgZmllbGQgPSBGaWVsZHMudG8oZ3JvdXAsIG1haWxib3gzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUbzogVGhlIERvZXM6IEpEIDxqb2huLmRvZUBhY21lLm9yZz4sICIKKyAgICAgICAgICAgICAgICArICJqYW5lLmRvZUBleGFtcGxlLm9yZzssIE1hcnkgU21pdGhcclxuIDxtYXJ5QGV4YW1wbGUubmV0PiIsCisgICAgICAgICAgICAgICAgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisKKyAgICAgICAgZmllbGQgPSBGaWVsZHMudG8oQXJyYXlzLmFzTGlzdChncm91cCwgbWFpbGJveDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUbzogVGhlIERvZXM6IEpEIDxqb2huLmRvZUBhY21lLm9yZz4sICIKKyAgICAgICAgICAgICAgICArICJqYW5lLmRvZUBleGFtcGxlLm9yZzssIE1hcnkgU21pdGhcclxuIDxtYXJ5QGV4YW1wbGUubmV0PiIsCisgICAgICAgICAgICAgICAgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1haWxib3ggbWFpbGJveDEgPSBNYWlsYm94LnBhcnNlKCJKRCA8am9obi5kb2VAYWNtZS5vcmc+Iik7CisgICAgICAgIE1haWxib3ggbWFpbGJveDIgPSBNYWlsYm94LnBhcnNlKCJqYW5lLmRvZUBleGFtcGxlLm9yZyIpOworICAgICAgICBNYWlsYm94IG1haWxib3gzID0gTWFpbGJveC5wYXJzZSgiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iKTsKKyAgICAgICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoIlRoZSBEb2VzIiwgbWFpbGJveDEsIG1haWxib3gyKTsKKworICAgICAgICBBZGRyZXNzTGlzdEZpZWxkIGZpZWxkID0gRmllbGRzLmNjKGdyb3VwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYzogVGhlIERvZXM6IEpEIDxqb2huLmRvZUBhY21lLm9yZz4sICIKKyAgICAgICAgICAgICAgICArICJqYW5lLmRvZUBleGFtcGxlLm9yZzsiLCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKworICAgICAgICBmaWVsZCA9IEZpZWxkcy5jYyhncm91cCwgbWFpbGJveDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNjOiBUaGUgRG9lczogSkQgPGpvaG4uZG9lQGFjbWUub3JnPiwgIgorICAgICAgICAgICAgICAgICsgImphbmUuZG9lQGV4YW1wbGUub3JnOywgTWFyeSBTbWl0aFxyXG4gPG1hcnlAZXhhbXBsZS5uZXQ+IiwKKyAgICAgICAgICAgICAgICBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKworICAgICAgICBmaWVsZCA9IEZpZWxkcy5jYyhBcnJheXMuYXNMaXN0KGdyb3VwLCBtYWlsYm94MykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNjOiBUaGUgRG9lczogSkQgPGpvaG4uZG9lQGFjbWUub3JnPiwgIgorICAgICAgICAgICAgICAgICsgImphbmUuZG9lQGV4YW1wbGUub3JnOywgTWFyeSBTbWl0aFxyXG4gPG1hcnlAZXhhbXBsZS5uZXQ+IiwKKyAgICAgICAgICAgICAgICBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmNjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1haWxib3ggbWFpbGJveDEgPSBNYWlsYm94LnBhcnNlKCJKRCA8am9obi5kb2VAYWNtZS5vcmc+Iik7CisgICAgICAgIE1haWxib3ggbWFpbGJveDIgPSBNYWlsYm94LnBhcnNlKCJqYW5lLmRvZUBleGFtcGxlLm9yZyIpOworICAgICAgICBNYWlsYm94IG1haWxib3gzID0gTWFpbGJveC5wYXJzZSgiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iKTsKKyAgICAgICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoIlRoZSBEb2VzIiwgbWFpbGJveDEsIG1haWxib3gyKTsKKworICAgICAgICBBZGRyZXNzTGlzdEZpZWxkIGZpZWxkID0gRmllbGRzLmJjYyhncm91cCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQmNjOiBUaGUgRG9lczogSkQgPGpvaG4uZG9lQGFjbWUub3JnPiwgIgorICAgICAgICAgICAgICAgICsgImphbmUuZG9lQGV4YW1wbGUub3JnOyIsIGRlY29kZShmaWVsZC5nZXRSYXcoKSkpOworCisgICAgICAgIGZpZWxkID0gRmllbGRzLmJjYyhncm91cCwgbWFpbGJveDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJjYzogVGhlIERvZXM6IEpEIDxqb2huLmRvZUBhY21lLm9yZz4sICIKKyAgICAgICAgICAgICAgICArICJqYW5lLmRvZUBleGFtcGxlLm9yZzssIE1hcnkgU21pdGhcclxuIDxtYXJ5QGV4YW1wbGUubmV0PiIsCisgICAgICAgICAgICAgICAgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisKKyAgICAgICAgZmllbGQgPSBGaWVsZHMuYmNjKEFycmF5cy5hc0xpc3QoZ3JvdXAsIG1haWxib3gzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQmNjOiBUaGUgRG9lczogSkQgPGpvaG4uZG9lQGFjbWUub3JnPiwgIgorICAgICAgICAgICAgICAgICsgImphbmUuZG9lQGV4YW1wbGUub3JnOywgTWFyeSBTbWl0aFxyXG4gPG1hcnlAZXhhbXBsZS5uZXQ+IiwKKyAgICAgICAgICAgICAgICBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbHlUbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYWlsYm94IG1haWxib3gxID0gTWFpbGJveC5wYXJzZSgiSkQgPGpvaG4uZG9lQGFjbWUub3JnPiIpOworICAgICAgICBNYWlsYm94IG1haWxib3gyID0gTWFpbGJveC5wYXJzZSgiamFuZS5kb2VAZXhhbXBsZS5vcmciKTsKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MyA9IE1haWxib3gucGFyc2UoIk1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+Iik7CisgICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKCJUaGUgRG9lcyIsIG1haWxib3gxLCBtYWlsYm94Mik7CisKKyAgICAgICAgQWRkcmVzc0xpc3RGaWVsZCBmaWVsZCA9IEZpZWxkcy5yZXBseVRvKGdyb3VwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXBseS1UbzogVGhlIERvZXM6IEpEIDxqb2huLmRvZUBhY21lLm9yZz4sICIKKyAgICAgICAgICAgICAgICArICJqYW5lLmRvZUBleGFtcGxlLm9yZzsiLCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKworICAgICAgICBmaWVsZCA9IEZpZWxkcy5yZXBseVRvKGdyb3VwLCBtYWlsYm94Myk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVwbHktVG86IFRoZSBEb2VzOiBKRCA8am9obi5kb2VAYWNtZS5vcmc+LCAiCisgICAgICAgICAgICAgICAgKyAiamFuZS5kb2VAZXhhbXBsZS5vcmc7LCBNYXJ5XHJcbiBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iLAorICAgICAgICAgICAgICAgIGRlY29kZShmaWVsZC5nZXRSYXcoKSkpOworCisgICAgICAgIGZpZWxkID0gRmllbGRzLnJlcGx5VG8oQXJyYXlzLmFzTGlzdChncm91cCwgbWFpbGJveDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXBseS1UbzogVGhlIERvZXM6IEpEIDxqb2huLmRvZUBhY21lLm9yZz4sICIKKyAgICAgICAgICAgICAgICArICJqYW5lLmRvZUBleGFtcGxlLm9yZzssIE1hcnlcclxuIFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiIsCisgICAgICAgICAgICAgICAgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE1haWxib3goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFpbGJveEZpZWxkIGZpZWxkID0gRmllbGRzLm1haWxib3goIlJlc2VudC1TZW5kZXIiLCBNYWlsYm94CisgICAgICAgICAgICAgICAgLnBhcnNlKCJKRCA8am9obi5kb2VAYWNtZS5vcmc+IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc2VudC1TZW5kZXI6IEpEIDxqb2huLmRvZUBhY21lLm9yZz4iLCBkZWNvZGUoZmllbGQKKyAgICAgICAgICAgICAgICAuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFpbGJveExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MSA9IE1haWxib3gucGFyc2UoIkpEIDxqb2huLmRvZUBhY21lLm9yZz4iKTsKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MiA9IE1haWxib3gucGFyc2UoIk1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+Iik7CisKKyAgICAgICAgTWFpbGJveExpc3RGaWVsZCBmaWVsZCA9IEZpZWxkcy5tYWlsYm94TGlzdCgiUmVzZW50LUZyb20iLCBBcnJheXMKKyAgICAgICAgICAgICAgICAuYXNMaXN0KG1haWxib3gxLCBtYWlsYm94MikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc2VudC1Gcm9tOiBKRCA8am9obi5kb2VAYWNtZS5vcmc+LCAiCisgICAgICAgICAgICAgICAgKyAiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iLCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkcmVzc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MSA9IE1haWxib3gucGFyc2UoIkpEIDxqb2huLmRvZUBhY21lLm9yZz4iKTsKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MiA9IE1haWxib3gucGFyc2UoImphbmUuZG9lQGV4YW1wbGUub3JnIik7CisgICAgICAgIE1haWxib3ggbWFpbGJveDMgPSBNYWlsYm94LnBhcnNlKCJNYXJ5IFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiIpOworICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cCgiVGhlIERvZXMiLCBtYWlsYm94MSwgbWFpbGJveDIpOworCisgICAgICAgIEFkZHJlc3NMaXN0RmllbGQgZmllbGQgPSBGaWVsZHMuYWRkcmVzc0xpc3QoIlJlc2VudC1UbyIsIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgZ3JvdXAsIG1haWxib3gzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVzZW50LVRvOiBUaGUgRG9lczogSkQgPGpvaG4uZG9lQGFjbWUub3JnPiwgIgorICAgICAgICAgICAgICAgICsgImphbmUuZG9lQGV4YW1wbGUub3JnOywgTWFyeVxyXG4gU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+IiwKKyAgICAgICAgICAgICAgICBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZpZWxkTmFtZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmllbGRzLmRhdGUoImludmFsaWQgZmllbGQgbmFtZSIsIG5ldyBEYXRlKCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGRlY29kZShCeXRlU2VxdWVuY2UgYnl0ZVNlcXVlbmNlKSB7CisgICAgICAgIHJldHVybiBDb250ZW50VXRpbC5kZWNvZGUoYnl0ZVNlcXVlbmNlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvVW5zdHJ1Y3R1cmVkRmllbGRUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL1Vuc3RydWN0dXJlZEZpZWxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ODQ5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL1Vuc3RydWN0dXJlZEZpZWxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5BYnN0cmFjdEZpZWxkOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5VbnN0cnVjdHVyZWRGaWVsZDsNCisNCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOw0KKw0KK3B1YmxpYyBjbGFzcyBVbnN0cnVjdHVyZWRGaWVsZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBVbnN0cnVjdHVyZWRGaWVsZCBmID0gbnVsbDsNCisgICAgICAgIA0KKyAgICAgICAgZiA9IChVbnN0cnVjdHVyZWRGaWVsZCkgQWJzdHJhY3RGaWVsZC5wYXJzZSgiU3ViamVjdDogWWFkYVxyXG4geWFkYSB5YWRhXHJcbiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0aW5nIGZvbGRpbmcgdmFsdWUgMSIsICJZYWRhIHlhZGEgeWFkYSIsIGYuZ2V0VmFsdWUoKSk7DQorICAgICAgICANCisgICAgICAgIGYgPSAoVW5zdHJ1Y3R1cmVkRmllbGQpIEFic3RyYWN0RmllbGQucGFyc2UoIlN1YmplY3Q6ICBcclxuXHR5YWRhIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3RpbmcgZm9sZGluZyB2YWx1ZSAyIiwgIiBcdHlhZGEiLCBmLmdldFZhbHVlKCkpOw0KKyAgICAgICAgDQorICAgICAgICBmID0gKFVuc3RydWN0dXJlZEZpZWxkKSBBYnN0cmFjdEZpZWxkLnBhcnNlKCJTdWJqZWN0OnlhZGEiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiVGVzdGluZyB2YWx1ZSB3aXRob3V0IGEgbGVhZGluZyAnICciLCAieWFkYSIsIGYuZ2V0VmFsdWUoKSk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0FkZHJlc3NUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2FkZHJlc3MvQWRkcmVzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzI1YTFkCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9hZGRyZXNzL0FkZHJlc3NUZXN0LmphdmEKQEAgLTAsMCArMSw0ODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3M7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MucGFyc2VyLlBhcnNlRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOw0KK2ltcG9ydCBqYXZhLmlvLlBpcGVkSW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7DQoraW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQorcHVibGljIGNsYXNzIEFkZHJlc3NUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uVHJlZSgpIHsNCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IG91ciBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIE1pbWVFeGNlcHRpb24uDQorICAgICAgICBhc3NlcnRUcnVlKE1pbWVFeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShQYXJzZUV4Y2VwdGlvbi5jbGFzcykpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZTEoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gew0KKyAgICAgICAgQWRkcmVzc0xpc3QgYWRkckxpc3QgPSBBZGRyZXNzTGlzdC5wYXJzZSgiSm9obiBEb2UgPGpkb2VAbWFjaGluZShjb21tZW50KS4gIGV4YW1wbGU+Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWRkckxpc3Quc2l6ZSgpKTsNCisgICAgICAgIE1haWxib3ggbWFpbGJveCA9IChNYWlsYm94KWFkZHJMaXN0LmdldCgwKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiSm9obiBEb2UiLCBtYWlsYm94LmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImpkb2UiLCBtYWlsYm94LmdldExvY2FsUGFydCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygibWFjaGluZS5leGFtcGxlIiwgbWFpbGJveC5nZXREb21haW4oKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlMigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICBBZGRyZXNzTGlzdCBhZGRyTGlzdCA9IEFkZHJlc3NMaXN0LnBhcnNlKCJNYXJ5IFNtaXRoIFx0ICAgIFx0XHQgIDxtYXJ5QGV4YW1wbGUubmV0PiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFkZHJMaXN0LnNpemUoKSk7DQorICAgICAgICBNYWlsYm94IG1haWxib3ggPSAoTWFpbGJveClhZGRyTGlzdC5nZXQoMCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIk1hcnkgU21pdGgiLCBtYWlsYm94LmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcnkiLCBtYWlsYm94LmdldExvY2FsUGFydCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiZXhhbXBsZS5uZXQiLCBtYWlsYm94LmdldERvbWFpbigpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlHcm91cCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICBBZGRyZXNzTGlzdCBhZGRyTGlzdCA9IEFkZHJlc3NMaXN0LnBhcnNlKCJ1bmRpc2Nsb3NlZC1yZWNpcGllbnRzOjsiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBhZGRyTGlzdC5zaXplKCkpOw0KKyAgICAgICAgR3JvdXAgZ3JvdXAgPSAoR3JvdXApYWRkckxpc3QuZ2V0KDApOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGdyb3VwLmdldE1haWxib3hlcygpLnNpemUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInVuZGlzY2xvc2VkLXJlY2lwaWVudHMiLCBncm91cC5nZXROYW1lKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzeUdyb3VwQW5kTWFpbGJveCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICBBZGRyZXNzTGlzdCBhZGRyTGlzdCA9IEFkZHJlc3NMaXN0LnBhcnNlKCJNYXJrZXRpbmcgIGZvbGtzIDogIEphbmUgU21pdGggPCBqYW5lIEAgZXhhbXBsZSAuIG5ldCA+LCBcIiBKYWNrIFxcXCJKYWNraWVcXFwiIEpvbmVzIFwiIDwgampvbmVzQGV4YW1wbGUuY29tID4gKGNvbW1lbnQoY29tbWVudCkpOyAsLCAoY29tbWVudCkgICwgPEBleGFtcGxlIC4gbmV0LEBleGFtcGxlKGlnbm9yZVxcKSkuY29tOihpZ25vcmUpam9obkAoaWdub3JlKWV4YW1wbGUubmV0PiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGFkZHJMaXN0LnNpemUoKSk7DQorDQorICAgICAgICBHcm91cCBncm91cCA9IChHcm91cClhZGRyTGlzdC5nZXQoMCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIk1hcmtldGluZyAgZm9sa3MiLCBncm91cC5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGdyb3VwLmdldE1haWxib3hlcygpLnNpemUoKSk7DQorDQorICAgICAgICBNYWlsYm94IG1haWxib3gxID0gZ3JvdXAuZ2V0TWFpbGJveGVzKCkuZ2V0KDApOw0KKyAgICAgICAgTWFpbGJveCBtYWlsYm94MiA9IGdyb3VwLmdldE1haWxib3hlcygpLmdldCgxKTsNCisNCisgICAgICAgIGFzc2VydEVxdWFscygiSmFuZSBTbWl0aCIsIG1haWxib3gxLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImphbmUiLCBtYWlsYm94MS5nZXRMb2NhbFBhcnQoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImV4YW1wbGUubmV0IiwgbWFpbGJveDEuZ2V0RG9tYWluKCkpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgSmFjayBcIkphY2tpZVwiIEpvbmVzICIsIG1haWxib3gyLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImpqb25lcyIsIG1haWxib3gyLmdldExvY2FsUGFydCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiZXhhbXBsZS5jb20iLCBtYWlsYm94Mi5nZXREb21haW4oKSk7DQorDQorICAgICAgICBNYWlsYm94IG1haWxib3ggPSAoTWFpbGJveClhZGRyTGlzdC5nZXQoMSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImpvaG4iLCBtYWlsYm94LmdldExvY2FsUGFydCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiZXhhbXBsZS5uZXQiLCBtYWlsYm94LmdldERvbWFpbigpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygyLCBtYWlsYm94LmdldFJvdXRlKCkuc2l6ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiZXhhbXBsZS5uZXQiLCBtYWlsYm94LmdldFJvdXRlKCkuZ2V0KDApKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiZXhhbXBsZS5jb20iLCBtYWlsYm94LmdldFJvdXRlKCkuZ2V0KDEpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlBZGRyZXNzTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQWRkcmVzc0xpc3QucGFyc2UoIiAgXHQgICBcdCAiKS5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEFkZHJlc3NMaXN0LnBhcnNlKCIgIFx0ICAsICAsICwgLCwsICwgXHQgIikuc2l6ZSgpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRm9ybSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICBBZGRyZXNzTGlzdCBhZGRyTGlzdCA9IEFkZHJlc3NMaXN0LnBhcnNlKCJcImEgYiBjIGQgZSBmIGdcIiAoY29tbWVudCkgQGV4YW1wbGUubmV0Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWRkckxpc3Quc2l6ZSgpKTsNCisgICAgICAgIE1haWxib3ggbWFpbGJveCA9IChNYWlsYm94KWFkZHJMaXN0LmdldCgwKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiYSBiIGMgZCBlIGYgZyIsIG1haWxib3guZ2V0TG9jYWxQYXJ0KCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGFtcGxlLm5ldCIsIG1haWxib3guZ2V0RG9tYWluKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGF0dGVuKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsNCisgICAgICAgIEFkZHJlc3NMaXN0IGFkZHJMaXN0ID0gQWRkcmVzc0xpc3QucGFyc2UoImRldiA6IG9uZUBleGFtcGxlLmNvbSwgdHdvQGV4YW1wbGUuY29tOyAsICwsLCBtYXJrZXRpbmc6dGhyZWVAZXhhbXBsZS5jb20gLGZvdXJAZXhhbXBsZS5jb207LCBmaXZlQGV4YW1wbGUuY29tIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMywgYWRkckxpc3Quc2l6ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyg1LCBhZGRyTGlzdC5mbGF0dGVuKCkuc2l6ZSgpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9ydHVyZVRlc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gew0KKw0KKyAgICAgICAgLy8gU291cmNlOiBodHRwOi8vbWFpbGZvcm1hdC5kYW4uaW5mby9oZWFkZXJzL2Zyb20uaHRtbA0KKyAgICAgICAgLy8gKENvbW1lbnRlZCBvdXQgcGVuZGluZyBjb25maXJtYXRpb24gb2YgbGVnYWxpdHktLUkgdGhpbmsgdGhlIGxvY2FsLXBhcnQgaXMgaWxsZWdhbC4pIA0KKyAgICAgICAgLy8gQWRkcmVzc0xpc3QucGFyc2UoIlwiR3V5IE1hY29uXCIgPGd1eW1hY29uK1wiIGh0dHA6Ly93d3cuZ3V5bWFjb24uY29tLyBcIjAwQHNwYW1jb3AubmV0PiIpOw0KKw0KKyAgICAgICAgLy8gVGFrZW4gbW9zdGx5IGZyb20gUkZDODIyLg0KKw0KKyAgICAgICAgLy8gSnVzdCBtYWtlIHN1cmUgdGhlc2UgYXJlIHJlY29nbml6ZWQgYXMgbGVnYWwgYWRkcmVzcyBsaXN0czsNCisgICAgICAgIC8vIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgYXNwZWN0IG9mIHRoZSBSRkMgdGhhdCBpcyB0ZXN0ZWQgaGVyZQ0KKyAgICAgICAgLy8gYnV0IG5vdCBpbiB0aGUgb3RoZXIgdW5pdCB0ZXN0cy4NCisNCisgICAgICAgIEFkZHJlc3NMaXN0LnBhcnNlKCJBbGZyZWQgTmV1bWFuIDxOZXVtYW5AQkJOLVRFTkVYQT4iKTsNCisgICAgICAgIEFkZHJlc3NMaXN0LnBhcnNlKCJOZXVtYW5AQkJOLVRFTkVYQSIpOw0KKyAgICAgICAgQWRkcmVzc0xpc3QucGFyc2UoIlwiR2VvcmdlLCBUZWRcIiA8U2hhcmVkQEdyb3VwLkFycGFuZXQ+Iik7DQorICAgICAgICBBZGRyZXNzTGlzdC5wYXJzZSgiV2lsdCAuICh0aGUgU3RpbHQpIENoYW1iZXJsYWluQE5CQS5VUyIpOw0KKw0KKyAgICAgICAgLy8gTk9URTogSW4gUkZDODIyIDguMS41LCB0aGUgZm9sbG93aW5nIGV4YW1wbGUgZGlkIG5vdCBoYXZlICJHYWxsb3BpbmcgR291cm1ldCINCisgICAgICAgIC8vIGluIGRvdWJsZS1xdW90ZXMuICBJIGNhbiBvbmx5IGFzc3VtZSB0aGlzIHdhcyBhIHR5cG8sIHNpbmNlIDYuMi40IHNwZWNpZmljYWxseQ0KKyAgICAgICAgLy8gZGlzYWxsb3dzIHNwYWNlcyBpbiB1bnF1b3RlZCBsb2NhbC1wYXJ0Lg0KKyAgICAgICAgQWRkcmVzc0xpc3QucGFyc2UoIiAgICAgR291cm1ldHM6ICBQb21wb3VzIFBlcnNvbiA8V2hvWmlXaGF0Wml0QENvcmRvbi1CbGV1PiwiICsNCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBDaGlsZHNAV0dCSC5Cb3N0b24sIFwiR2FsbG9waW5nIEdvdXJtZXRcIkAiICsNCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBBTlQuRG93bi1VbmRlciAoQXVzdHJhbGlhbiBOYXRpb25hbCBUZWxldmlzaW9uKSwiICsNCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBDaGVhcGllQERpc2NvdW50LUxpcXVvcnM7LCIgKw0KKyAgICAgICAgICAgICAgICAiICAgICAgIENydWlzZXJzOiAgUG9ydEBQb3J0dWdhbCwgSm9uZXNAU0VBOywiICsNCisgICAgICAgICAgICAgICAgIiAgICAgICAgIEFub3RoZXJAU29tZXdoZXJlLlNvbWVPcmciKTsNCisNCisgICAgICAgIC8vIE5PVEU6IEluIFJGQzgyMiA4LjMuMywgdGhlIGZvbGxvd2luZyBleGFtcGxlIGVuZGVkIHdpdGggYSBsb25lICI+IiBhZnRlcg0KKyAgICAgICAgLy8gVG9wcy0yMC1Ib3N0LiAgSSBjYW4gb25seSBhc3N1bWUgdGhpcyB3YXMgYSB0eXBvLCBzaW5jZSA2LjEgY2xlYXJseSBzaG93cw0KKyAgICAgICAgLy8gIj4iIHJlcXVpcmVzIGEgbWF0Y2hpbmcgIjwiLg0KKyAgICAgICAgQWRkcmVzc0xpc3QucGFyc2UoIkltcG9ydGFudCBmb2xrOiIgKw0KKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIFRvbSBTb2Z0d29vZCA8QmFsc2FAVHJlZS5Sb290PiwiICsNCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICBcIlNhbSBJcnZpbmdcIkBPdGhlci1Ib3N0OywiICsNCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgU3RhbmRhcmQgRGlzdHJpYnV0aW9uOiIgKw0KKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIC9tYWluL2RhdmlzL3Blb3BsZS9zdGFuZGFyZEBPdGhlci1Ib3N0LCIgKw0KKyAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgIFwiPEpvbmVzPnN0YW5kYXJkLmRpc3QuM1wiQFRvcHMtMjAtSG9zdDsiKTsNCisNCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIGZyb20gYSBVc2VuZXQgcG9zdCBieSBEYW4gSi4gQmVybnN0ZWluOg0KKyAgICAgICAgLy8gaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3Vwcz9zZWxtPTE5OTZBdWcxNDE4LjIxLjAxLjI4MDgxJTQwa29vYmVyYS5tYXRoLnVpYy5lZHUNCisgICAgICAgIEFkZHJlc3NMaXN0LnBhcnNlKCJcIjpzeXNtYWlsXCJAICBTb21lLUdyb3VwLlx0ICAgICAgICAgU29tZS1PcmcsIE11aGFtbWVkLihJIGFtICB0aGUgZ3JlYXRlc3QpIEFsaSBAKHRoZSlWZWdhcy5XQkEiKTsNCisgICAgICAgIEFkZHJlc3NMaXN0LnBhcnNlKCJtZUBob21lLmNvbSAoY29tbWVudCAobmVzdGVkIChkZWVwbHlcXCkpKSkiKTsNCisgICAgICAgIEFkZHJlc3NMaXN0LnBhcnNlKCJtYWlsaW5nIGxpc3Q6IG1lQGhvbWUuY29tLCByb3V0ZSB0d28gPHlvdUB3b3JrLmNvbT4sIHRoZW1AcGxheS5jb20gOyIpOw0KKw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RMZXhpY2FsRXJyb3IoKSB7DQorICAgICAgICAvLyBlbnN1cmUgdGhhdCBUb2tlbk1nckVycm9yIGRvZXNuJ3QgZ2V0IHRocm93bg0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBBZGRyZXNzTGlzdC5wYXJzZSgiKSIpOw0KKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIHBhcnNpbmcgZXJyb3IiKTsNCisgICAgICAgIH0NCisgICAgICAgIGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7DQorDQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsQ29uc3RydWN0b3JBbmRCYWRVc2FnZSgpIHsNCisgICAgICAgIEFkZHJlc3NMaXN0IGFsID0gbmV3IEFkZHJlc3NMaXN0KG51bGwsIGZhbHNlKTsNCisgICAgICAgIGFzc2VydEVxdWFscygwLCBhbC5zaXplKCkpOw0KKyAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGFsLmdldCgtMSk7DQorICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgaW5kZXggb3V0IG9mIGJvdW5kIGV4Y2VwdGlvbiEiKTsNCisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGFsLmdldCgwKTsNCisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBpbmRleCBvdXQgb2YgYm91bmQgZXhjZXB0aW9uISIpOw0KKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRyZXNzTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICBBZGRyZXNzTGlzdCBhZGRsaXN0ID0gQWRkcmVzc0xpc3QucGFyc2UoImZvb0BleGFtcGxlLmNvbSwgYmFyQGV4YW1wbGUuY29tLCB0aGlyZEBleGFtcGxlLmNvbSIpOw0KKyAgICAgICAgTGlzdDxBZGRyZXNzPiBhbCA9IG5ldyBBcnJheUxpc3Q8QWRkcmVzcz4oKTsNCisgICAgICAgIGFsLmFkZChhZGRsaXN0LmdldCgwKSk7DQorDQorICAgICAgICAvLyBzaGFyZWQgYXJyYXlsaXN0DQorICAgICAgICBBZGRyZXNzTGlzdCBkbCA9IG5ldyBBZGRyZXNzTGlzdChhbCwgdHJ1ZSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZGwuc2l6ZSgpKTsNCisgICAgICAgIGFsLmFkZChhZGRsaXN0LmdldCgxKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZGwuc2l6ZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgLy8gY2xvbmVkIGFycmF5bGlzdA0KKyAgICAgICAgQWRkcmVzc0xpc3QgZGxjb3B5ID0gbmV3IEFkZHJlc3NMaXN0KGFsLCBmYWxzZSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZGxjb3B5LnNpemUoKSk7DQorICAgICAgICBhbC5hZGQoYWRkbGlzdC5nZXQoMikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRsY29weS5zaXplKCkpOw0KKyAgICAgICAgDQorICAgICAgICAvLyBjaGVjayByb3V0ZSBzdHJpbmcNCisgICAgICAgIGFzc2VydEVxdWFscygyLCBkbGNvcHkuZmxhdHRlbigpLnNpemUoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdEludGVyYWN0aXZlTWFpbigpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0X29yaWcgPSBTeXN0ZW0ub3V0Ow0KKyAgICAgICAgSW5wdXRTdHJlYW0gaW5fb3JpZyA9IFN5c3RlbS5pbjsNCisgICAgICAgIFByaW50U3RyZWFtIGVycl9vcmlnID0gU3lzdGVtLmVycjsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgUGlwZWRPdXRwdXRTdHJlYW0gcGlwZWQgPSBuZXcgUGlwZWRPdXRwdXRTdHJlYW0oKTsNCisgICAgICAgICAgICBQaXBlZElucHV0U3RyZWFtIG5ld0lucHV0ID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0ocGlwZWQpOw0KKyAgICAgICAgICAgIA0KKyAgICAgICAgICAgIFBpcGVkSW5wdXRTdHJlYW0gaW5PdXQgPSBuZXcgUGlwZWRJbnB1dFN0cmVhbSgpOw0KKyAgICAgICAgICAgIFByaW50U3RyZWFtIG91dFBzID0gbmV3IFByaW50U3RyZWFtKG5ldyBQaXBlZE91dHB1dFN0cmVhbShpbk91dCkpOw0KKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIG91dFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5PdXQpKTsNCisgICAgICAgICAgICBQaXBlZElucHV0U3RyZWFtIGluRXJyID0gbmV3IFBpcGVkSW5wdXRTdHJlYW0oKTsNCisgICAgICAgICAgICBQcmludFN0cmVhbSBlcnJQcyA9IG5ldyBQcmludFN0cmVhbShuZXcgUGlwZWRPdXRwdXRTdHJlYW0oaW5FcnIpKTsNCisgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBlcnJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluRXJyKSk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgU3lzdGVtLnNldEluKG5ld0lucHV0KTsNCisgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KG91dFBzKTsNCisgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKGVyclBzKTsNCisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7DQorICAgICAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7DQorICAgICAgICAgICAgICAgICAgICB0cnkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3NMaXN0Lm1haW4obnVsbCk7DQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIkNhdGNoZWQgYW4gZXhjZXB0aW9uIGluIG1haW46ICIrZSk7DQorICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9Ow0KKyAgICAgICAgICAgIHQuc3RhcnQoKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBQcmludFdyaXRlciBpbnB1dCA9IG5ldyBQcmludFdyaXRlcihwaXBlZCk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgaW5wdXQud3JpdGUoIlRlc3QgPHRlc3RAZXhhbXBsZS5jb20+XHJcbiIpOw0KKyAgICAgICAgICAgIGlucHV0LmZsdXNoKCk7DQorDQorICAgICAgICAgICAgU3RyaW5nIG91dCA9IG91dFJlYWRlci5yZWFkTGluZSgpOw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiPiBUZXN0IDx0ZXN0QGV4YW1wbGUuY29tPiIsIG91dCk7DQorDQorICAgICAgICAgICAgaW5wdXQud3JpdGUoIkEgPGZvb0BleGFtcGxlLmNvbT5cclxuIik7DQorICAgICAgICAgICAgaW5wdXQuZmx1c2goKTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBTdHJpbmcgb3V0MiA9IG91dFJlYWRlci5yZWFkTGluZSgpOw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiPiBBIDxmb29AZXhhbXBsZS5jb20+Iiwgb3V0Mik7DQorDQorICAgICAgICAgICAgaW5wdXQud3JpdGUoIlwiRm9vIEJhclwiIDxmb28+XHJcbiIpOw0KKyAgICAgICAgICAgIGlucHV0LmZsdXNoKCk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgU3RyaW5nIG91dDMgPSBlcnJSZWFkZXIucmVhZExpbmUoKTsNCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG91dDMpOw0KKw0KKyAgICAgICAgICAgIGlucHV0LndyaXRlKCJxdWl0XHJcbiIpOw0KKyAgICAgICAgICAgIGlucHV0LmZsdXNoKCk7DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgLy8gd2UgcmVhZCAyIGFuZ3VsYXIgYnJhY2tldHMgYmVjYXVzZSBvbmUgd2FzIGZyb20gdGhlIHByZXZpb3VzIGV4Y2VwdGlvbiBlcnJvci4NCisgICAgICAgICAgICBTdHJpbmcgb3V0NCA9IG91dFJlYWRlci5yZWFkTGluZSgpOw0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiPiA+IEdvb2RieWUuIiwgb3V0NCk7DQorDQorICAgICAgICAgICAgdC5qb2luKCk7DQorICAgICAgICB9IGZpbmFsbHkgew0KKyAgICAgICAgICAgIFN5c3RlbS5zZXRJbihpbl9vcmlnKTsNCisgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KG91dF9vcmlnKTsNCisgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKGVycl9vcmlnKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlEb21haW5MaXN0KCkgew0KKyAgICAgICAgRG9tYWluTGlzdCBkbCA9IG5ldyBEb21haW5MaXN0KG51bGwsIGZhbHNlKTsNCisgICAgICAgIGFzc2VydEVxdWFscygwLCBkbC5zaXplKCkpOw0KKyAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGRsLmdldCgtMSk7DQorICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgaW5kZXggb3V0IG9mIGJvdW5kIGV4Y2VwdGlvbiEiKTsNCisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGRsLmdldCgwKTsNCisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBpbmRleCBvdXQgb2YgYm91bmQgZXhjZXB0aW9uISIpOw0KKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3REb21haW5MaXN0KCkgew0KKyAgICAgICAgTGlzdDxTdHJpbmc+IGFsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7DQorICAgICAgICBhbC5hZGQoImV4YW1wbGUuY29tIik7DQorDQorICAgICAgICAvLyBzaGFyZWQgYXJyYXlsaXN0DQorICAgICAgICBEb21haW5MaXN0IGRsID0gbmV3IERvbWFpbkxpc3QoYWwsIHRydWUpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGRsLnNpemUoKSk7DQorICAgICAgICBhbC5hZGQoImZvby5leGFtcGxlLmNvbSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRsLnNpemUoKSk7DQorICAgICAgICANCisgICAgICAgIC8vIGNsb25lZCBhcnJheWxpc3QNCisgICAgICAgIERvbWFpbkxpc3QgZGxjb3B5ID0gbmV3IERvbWFpbkxpc3QoYWwsIGZhbHNlKTsNCisgICAgICAgIGFzc2VydEVxdWFscygyLCBkbGNvcHkuc2l6ZSgpKTsNCisgICAgICAgIGFsLmFkZCgiYmFyLmV4YW1wbGUuY29tIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZGxjb3B5LnNpemUoKSk7DQorICAgICAgICANCisgICAgICAgIC8vIGNoZWNrIHJvdXRlIHN0cmluZw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJAZXhhbXBsZS5jb20sQGZvby5leGFtcGxlLmNvbSIsIGRsY29weS50b1JvdXRlU3RyaW5nKCkpOw0KKyAgICB9DQorICAgIA0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlNYWlsYm94TGlzdCgpIHsNCisgICAgICAgIE1haWxib3hMaXN0IG1sID0gbmV3IE1haWxib3hMaXN0KG51bGwsIGZhbHNlKTsNCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtbC5zaXplKCkpOw0KKyAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIG1sLmdldCgtMSk7DQorICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgaW5kZXggb3V0IG9mIGJvdW5kIGV4Y2VwdGlvbiEiKTsNCisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KKyAgICAgICAgfQ0KKyAgICAgICAgDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIG1sLmdldCgwKTsNCisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBpbmRleCBvdXQgb2YgYm91bmQgZXhjZXB0aW9uISIpOw0KKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdE1haWxib3hMaXN0KCkgew0KKyAgICAgICAgTGlzdDxNYWlsYm94PiBhbCA9IG5ldyBBcnJheUxpc3Q8TWFpbGJveD4oKTsNCisgICAgICAgIGFsLmFkZChuZXcgTWFpbGJveCgibG9jYWwiLCJleGFtcGxlLmNvbSIpKTsNCisNCisgICAgICAgIC8vIHNoYXJlZCBhcnJheWxpc3QNCisgICAgICAgIE1haWxib3hMaXN0IG1sID0gbmV3IE1haWxib3hMaXN0KGFsLCB0cnVlKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBtbC5zaXplKCkpOw0KKyAgICAgICAgYWwuYWRkKG5ldyBNYWlsYm94KCJsb2NhbDIiLCAiZm9vLmV4YW1wbGUuY29tIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1sLnNpemUoKSk7DQorICAgICAgICANCisgICAgICAgIC8vIGNsb25lZCBhcnJheWxpc3QNCisgICAgICAgIE1haWxib3hMaXN0IG1sY29weSA9IG5ldyBNYWlsYm94TGlzdChhbCwgZmFsc2UpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1sY29weS5zaXplKCkpOw0KKyAgICAgICAgYWwuYWRkKG5ldyBNYWlsYm94KCJsb2NhbDMiLCAiYmFyLmV4YW1wbGUuY29tIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1sY29weS5zaXplKCkpOw0KKyAgICAgICAgDQorICAgICAgICBtbGNvcHkucHJpbnQoKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEdyb3VwU2VyaWFsaXphdGlvbigpIHsNCisgICAgICAgIExpc3Q8TWFpbGJveD4gYWwgPSBuZXcgQXJyYXlMaXN0PE1haWxib3g+KCk7DQorICAgICAgICBhbC5hZGQobmV3IE1haWxib3goInRlc3QiLCAiZXhhbXBsZS5jb20iKSk7DQorICAgICAgICBhbC5hZGQobmV3IE1haWxib3goIkZvbyEiLCAiZm9vIiwgImV4YW1wbGUuY29tIikpOw0KKyAgICAgICAgRG9tYWluTGlzdCBkbCA9IG5ldyBEb21haW5MaXN0KG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ImZvby5leGFtcGxlLmNvbSJ9KSksIHRydWUpOw0KKyAgICAgICAgTWFpbGJveCBtYWlsYm94ID0gbmV3IE1haWxib3goIkZvbyBCYXIiLCBkbCwgImZvbzIiLCAiZXhhbXBsZS5jb20iKTsNCisgICAgICAgIGFzc2VydFNhbWUoZGwsIG1haWxib3guZ2V0Um91dGUoKSk7DQorICAgICAgICBhbC5hZGQobWFpbGJveCk7DQorICAgICAgICBHcm91cCBnID0gbmV3IEdyb3VwKCJncm91cCIsIG5ldyBNYWlsYm94TGlzdChhbCwgZmFsc2UpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiZ3JvdXA6IHRlc3RAZXhhbXBsZS5jb20sIEZvbyEgPGZvb0BleGFtcGxlLmNvbT4sIEZvbyBCYXIgPGZvbzJAZXhhbXBsZS5jb20+OyIsIGcuZ2V0RGlzcGxheVN0cmluZygpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5UXVvdGVkU3RyaW5nQmVmb3JlRG90QXRvbUluTG9jYWxQYXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICAvKg0KKyAgICAgICAgICogVGhpcyB1c2VkIHRvIGdpdmUgYSBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluc3RlYWQgb2YgdGhlIGV4cGVjdGVkDQorICAgICAgICAgKiBQYXJzZUV4Y2VwdGlvbg0KKyAgICAgICAgICovDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIEFkZHJlc3NMaXN0LnBhcnNlKCJcIlwiYmFyQGJhci5jb20iKTsNCisgICAgICAgICAgICBmYWlsKCJQYXJzZUV4Y2VwdGlvbiBleHBlY3RlZCIpOw0KKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIHsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdE1haWxib3hHZXRFbmNvZGVkU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImpvaG4uZG9lQGFjbWUub3JnIiwgbmV3IE1haWxib3goImpvaG4uZG9lIiwgImFjbWUub3JnIikNCisgICAgICAgICAgICAgICAgLmdldEVuY29kZWRTdHJpbmcoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlwiam9obiBkb2VcIkBhY21lLm9yZyIsIG5ldyBNYWlsYm94KCJqb2huIGRvZSIsDQorICAgICAgICAgICAgICAgICJhY21lLm9yZyIpLmdldEVuY29kZWRTdHJpbmcoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkpvaG4gRG9lIDxqb2huLmRvZUBhY21lLm9yZz4iLCBuZXcgTWFpbGJveCgiSm9obiBEb2UiLA0KKyAgICAgICAgICAgICAgICAiam9obi5kb2UiLCAiYWNtZS5vcmciKS5nZXRFbmNvZGVkU3RyaW5nKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcIkpvaG4gRG9lIEBIb21lXCIgPGpvaG4uZG9lQGFjbWUub3JnPiIsIG5ldyBNYWlsYm94KA0KKyAgICAgICAgICAgICAgICAiSm9obiBEb2UgQEhvbWUiLCAiam9obi5kb2UiLCAiYWNtZS5vcmciKS5nZXRFbmNvZGVkU3RyaW5nKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P0lTTy04ODU5LTE/UT9IYW5zX009RkNsbGVyPz0gPGhhbnMubXVlbGxlckBhY21lLm9yZz4iLA0KKyAgICAgICAgICAgICAgICBuZXcgTWFpbGJveCgiSGFucyBNXDM3NGxsZXIiLCAiaGFucy5tdWVsbGVyIiwgImFjbWUub3JnIikNCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RW5jb2RlZFN0cmluZygpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBHZXRFbmNvZGVkU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBMaXN0PE1haWxib3g+IGFsID0gbmV3IEFycmF5TGlzdDxNYWlsYm94PigpOw0KKyAgICAgICAgYWwuYWRkKG5ldyBNYWlsYm94KCJ0ZXN0IiwgImV4YW1wbGUuY29tIikpOw0KKyAgICAgICAgYWwuYWRkKG5ldyBNYWlsYm94KCJGb28hIiwgImZvbyIsICJleGFtcGxlLmNvbSIpKTsNCisgICAgICAgIGFsLmFkZChuZXcgTWFpbGJveCgiSGFucyBNXDM3NGxsZXIiLCAiaGFucy5tdWVsbGVyIiwgImFjbWUub3JnIikpOw0KKyAgICAgICAgR3JvdXAgZyA9IG5ldyBHcm91cCgiZ3JvdXAgQHdvcmsiLCBuZXcgTWFpbGJveExpc3QoYWwsIGZhbHNlKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlwiZ3JvdXAgQHdvcmtcIjogdGVzdEBleGFtcGxlLmNvbSwgIg0KKyAgICAgICAgICAgICAgICArICJGb28hIDxmb29AZXhhbXBsZS5jb20+LCA9P0lTTy04ODU5LTE/UT9IYW5zX009RkNsbGVyPz0iDQorICAgICAgICAgICAgICAgICsgIiA8aGFucy5tdWVsbGVyQGFjbWUub3JnPjsiLCBnLmdldEVuY29kZWRTdHJpbmcoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5R3JvdXBHZXRFbmNvZGVkU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBNYWlsYm94TGlzdCBlbXB0eU1haWxib3hlcyA9IG5ldyBNYWlsYm94TGlzdChudWxsLCB0cnVlKTsNCisgICAgICAgIEdyb3VwIGcgPSBuZXcgR3JvdXAoIlVuZGlzY2xvc2VkIHJlY2lwaWVudHMiLCBlbXB0eU1haWxib3hlcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZGlzY2xvc2VkIHJlY2lwaWVudHM6OyIsIGcuZ2V0RW5jb2RlZFN0cmluZygpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBBZGRyZXNzIGFkZHJlc3MgPSBBZGRyZXNzLnBhcnNlKCJNYXJ5IFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiIpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShhZGRyZXNzIGluc3RhbmNlb2YgTWFpbGJveCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIk1hcnkgU21pdGgiLCAoKE1haWxib3gpIGFkZHJlc3MpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcnlAZXhhbXBsZS5uZXQiLCAoKE1haWxib3gpIGFkZHJlc3MpLmdldEFkZHJlc3MoKSk7DQorDQorICAgICAgICBhZGRyZXNzID0gQWRkcmVzcy5wYXJzZSgiZ3JvdXA6IE1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+OyIpOw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShhZGRyZXNzIGluc3RhbmNlb2YgR3JvdXApOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJncm91cCIsICgoR3JvdXApIGFkZHJlc3MpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIk1hcnkgU21pdGgiLCAoKEdyb3VwKSBhZGRyZXNzKS5nZXRNYWlsYm94ZXMoKS5nZXQoMCkNCisgICAgICAgICAgICAgICAgLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcnlAZXhhbXBsZS5uZXQiLCAoKEdyb3VwKSBhZGRyZXNzKS5nZXRNYWlsYm94ZXMoKQ0KKyAgICAgICAgICAgICAgICAuZ2V0KDApLmdldEFkZHJlc3MoKSk7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIEdyb3VwLnBhcnNlKCJqb2huLmRvZUBhY21lLm9yZywgamFuZS5kb2VAYWNtZS5vcmciKTsNCisgICAgICAgICAgICBmYWlsKCk7DQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsNCisgICAgICAgIH0NCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlR3JvdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIEdyb3VwIGdyb3VwID0gR3JvdXANCisgICAgICAgICAgICAgICAgLnBhcnNlKCJncm91cDogam9obi5kb2VAYWNtZS5vcmcsIE1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+OyIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJncm91cCIsIGdyb3VwLmdldE5hbWUoKSk7DQorDQorICAgICAgICBNYWlsYm94TGlzdCBtYWlsYm94ZXMgPSBncm91cC5nZXRNYWlsYm94ZXMoKTsNCisgICAgICAgIGFzc2VydEVxdWFscygyLCBtYWlsYm94ZXMuc2l6ZSgpKTsNCisNCisgICAgICAgIE1haWxib3ggbWFpbGJveDEgPSBtYWlsYm94ZXMuZ2V0KDApOw0KKyAgICAgICAgYXNzZXJ0TnVsbChtYWlsYm94MS5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqb2huLmRvZUBhY21lLm9yZyIsIG1haWxib3gxLmdldEFkZHJlc3MoKSk7DQorDQorICAgICAgICBNYWlsYm94IG1haWxib3gyID0gbWFpbGJveGVzLmdldCgxKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiTWFyeSBTbWl0aCIsIG1haWxib3gyLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcnlAZXhhbXBsZS5uZXQiLCBtYWlsYm94Mi5nZXRBZGRyZXNzKCkpOw0KKw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBHcm91cC5wYXJzZSgiam9obi5kb2VAYWNtZS5vcmciKTsNCisgICAgICAgICAgICBmYWlsKCk7DQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsNCisgICAgICAgIH0NCisNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgR3JvdXAucGFyc2UoImcxOiBqb2huLmRvZUBhY21lLm9yZzssIGcyOiBtYXJ5QGV4YW1wbGUubmV0OyIpOw0KKyAgICAgICAgICAgIGZhaWwoKTsNCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgew0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1haWxib3goKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIE1haWxib3ggbWFpbGJveDEgPSBNYWlsYm94LnBhcnNlKCJqb2huLmRvZUBhY21lLm9yZyIpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChtYWlsYm94MS5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqb2huLmRvZUBhY21lLm9yZyIsIG1haWxib3gxLmdldEFkZHJlc3MoKSk7DQorDQorICAgICAgICBNYWlsYm94IG1haWxib3gyID0gTWFpbGJveC5wYXJzZSgiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiTWFyeSBTbWl0aCIsIG1haWxib3gyLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcnlAZXhhbXBsZS5uZXQiLCBtYWlsYm94Mi5nZXRBZGRyZXNzKCkpOw0KKw0KKyAgICAgICAgLy8gbm9uLWFzY2lpIHNob3VsZCBiZSBhbGxvd2VkIGluIHF1b3RlZCBzdHJpbmdzDQorICAgICAgICBNYWlsYm94IG1haWxib3gzID0gTWFpbGJveA0KKyAgICAgICAgICAgICAgICAucGFyc2UoIlwiSGFucyBNXDM3NGxsZXJcIiA8aGFucy5tdWVsbGVyQGFjbWUub3JnPiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIYW5zIE1cMzc0bGxlciIsIG1haWxib3gzLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImhhbnMubXVlbGxlckBhY21lLm9yZyIsIG1haWxib3gzLmdldEFkZHJlc3MoKSk7DQorDQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIE1haWxib3gucGFyc2UoImc6IE1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+OyIpOw0KKyAgICAgICAgICAgIGZhaWwoKTsNCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgew0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBNYWlsYm94LnBhcnNlKCJNYXJ5IFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiwgaGFucy5tdWVsbGVyQGFjbWUub3JnIik7DQorICAgICAgICAgICAgZmFpbCgpOw0KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvY29udGVudGRpc3Bvc2l0aW9uL0NvbnRlbnREaXNwb3NpdGlvblRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvY29udGVudGRpc3Bvc2l0aW9uL0NvbnRlbnREaXNwb3NpdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTEzNWI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9jb250ZW50ZGlzcG9zaXRpb24vQ29udGVudERpc3Bvc2l0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuY29udGVudGRpc3Bvc2l0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5jb250ZW50ZGlzcG9zaXRpb24ucGFyc2VyLlBhcnNlRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgQ29udGVudERpc3Bvc2l0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25UcmVlKCkgeworICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBvdXIgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBNaW1lRXhjZXB0aW9uLgorICAgICAgICBhc3NlcnRUcnVlKE1pbWVFeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShQYXJzZUV4Y2VwdGlvbi5jbGFzcykpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvY29udGVudHR5cGUvQ29udGVudFR5cGVUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZmQ4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmNvbnRlbnR0eXBlOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5jb250ZW50dHlwZS5wYXJzZXIuQ29udGVudFR5cGVQYXJzZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmNvbnRlbnR0eXBlLnBhcnNlci5QYXJzZUV4Y2VwdGlvbjsNCisNCitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgQ29udGVudFR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uVHJlZSgpIHsNCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IG91ciBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIE1pbWVFeGNlcHRpb24uDQorICAgICAgICBhc3NlcnRUcnVlKE1pbWVFeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShQYXJzZUV4Y2VwdGlvbi5jbGFzcykpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50VHlwZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICB0ZXN0KCJvbmUvdHdvOyB0aHJlZSAgICAgICAgICA9ICBmb3VyIiwgIm9uZSIsICJ0d28iKTsNCisgICAgICAgIHRlc3QoIm9uZS8oZm9vKXR3bzsgdGhyZWUgICAgICAgICAgPSAgXCJmb3VyXCIiLCAib25lIiwgInR3byIpOw0KKyAgICAgICAgdGVzdCgib25lKGZvbykvdHdvOyB0aHJlZSAgICAgICAgICA9ICAoZm9vKSBmb3VyIiwgIm9uZSIsICJ0d28iKTsNCisgICAgICAgIHRlc3QoIm9uZS90d287IHRocmVlICAgICAgICAgID0gIGZvdXIiLCAib25lIiwgInR3byIpOw0KKw0KKyAgICAgICAgLy8gVE9ETzogYWRkIG1vcmUgdGVzdHMNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgdGVzdChTdHJpbmcgdmFsLCBTdHJpbmcgZXhwZWN0ZWRUeXBlLCBTdHJpbmcgZXhwZWN0ZWRTdWJ0eXBlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gew0KKyAgICAgICAgQ29udGVudFR5cGVQYXJzZXIgcGFyc2VyID0gbmV3IENvbnRlbnRUeXBlUGFyc2VyKG5ldyBTdHJpbmdSZWFkZXIodmFsKSk7DQorICAgICAgICBwYXJzZXIucGFyc2VBbGwoKTsNCisNCisgICAgICAgIFN0cmluZyB0eXBlID0gcGFyc2VyLmdldFR5cGUoKTsNCisgICAgICAgIFN0cmluZyBzdWJ0eXBlID0gcGFyc2VyLmdldFN1YlR5cGUoKTsNCisNCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFR5cGUsIHR5cGUpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3VidHlwZSwgc3VidHlwZSk7DQorICAgIH0NCisNCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9maWVsZC9kYXRldGltZS9EYXRlVGltZVRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvZGF0ZXRpbWUvRGF0ZVRpbWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyODc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvZGF0ZXRpbWUvRGF0ZVRpbWVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmRhdGV0aW1lOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLk1pbWVFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmRhdGV0aW1lLnBhcnNlci5EYXRlVGltZVBhcnNlcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuZGF0ZXRpbWUucGFyc2VyLlBhcnNlRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsNCisNCitwdWJsaWMgY2xhc3MgRGF0ZVRpbWVUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvblRyZWUoKSB7DQorICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCBvdXIgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBNaW1lRXhjZXB0aW9uLg0KKyAgICAgICAgYXNzZXJ0VHJ1ZShNaW1lRXhjZXB0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsRGF0ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7DQorICAgICAgICBuZXcgRGF0ZVRpbWVQYXJzZXIobmV3IFN0cmluZ1JlYWRlcigiRnJpLCAyMSBOb3YgMTk5NyAwOTo1NTowNiAtMDYwMCIpKS5wYXJzZUFsbCgpOw0KKyAgICAgICAgbmV3IERhdGVUaW1lUGFyc2VyKG5ldyBTdHJpbmdSZWFkZXIoIjIxIE5vdiA5NyAwOTo1NTowNiBHTVQiKSkucGFyc2VBbGwoKTsNCisNCisNCisgICAgICAgIGVuc3VyZUFsbEVxdWFsKG5ldyBTdHJpbmdbXSB7DQorICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAwOTo1NTowNiAtMDYwMCIsIC8vIGJhc2VsaW5lDQorICAgICAgICAgICAiRnJpLCAyMSBOb3YgOTcgMDk6NTU6MDYgLTA2MDAiLCAgIC8vIDItZGlnaXQgeWVhcg0KKyAgICAgICAgICAgIkZyaSwgMjEgTm92IDA5NyAwOTo1NTowNiAtMDYwMCIsICAvLyAzLWRpZ2l0IHllYXINCisgICAgICAgICAgICJGcmksIDIxIE5vdiAxOTk3IDEwOjU1OjA2IC0wNTAwIiwgLy8gc2hpZnQgdGltZSB6b25lDQorICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxOToyNTowNiArMDMzMCIsIC8vIHNoaWZ0IHRpbWUgem9uZQ0KKyAgICAgICAgICAgIjIxIE5vdiAxOTk3IDA5OjU1OjA2IC0wNjAwIiAgICAgICAvLyBvbWl0IGRheSBvZiB3ZWVrDQorICAgICAgICB9KTsNCisNCisgICAgICAgIGVuc3VyZUFsbEVxdWFsKG5ldyBTdHJpbmdbXSB7DQorICAgICAgICAgICAgIlRodSwgMTYgU2VwIDIwMTkgMTQ6Mzc6MjIgKzAwMDAiLCAvLyBiYXNlbGluZQ0KKyAgICAgICAgICAgICJUaHUsIDE2IFNlcCAxOSAxNDozNzoyMiArMDAwMCIsICAgLy8gMi1kaWdpdCB5ZWFyDQorICAgICAgICAgICAgIlRodSwgMTYgU2VwIDExOSAxNDozNzoyMiArMDAwMCIsICAvLyAzLWRpZ2l0IHllYXINCisgICAgICAgICAgICAiVGh1LCAxNiBTZXAgMjAxOSAxNDozNzoyMiAtMDAwMCIsIC8vIG1pbnVzLXplcm8gem9uZQ0KKyAgICAgICAgICAgICJUaHUsIDE2IFNlcCAyMDE5IDE0OjM3OjIyIEdNVCIsICAgLy8gYWx0ZXJuYXRlIHpvbmUNCisgICAgICAgICAgICAiVGh1LCAxNiBTZXAgMjAxOSAxNDozNzoyMiBVVCIgICAgIC8vIGFsdGVybmF0ZSB6b25lDQorICAgICAgICB9KTsNCisNCisgICAgICAgIGVuc3VyZUFsbEVxdWFsKG5ldyBTdHJpbmdbXSB7DQorICAgICAgICAgICAgIkZyaSwgMjEgTm92IDE5OTcgMTI6MDA6MDAgR01UIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAwNzowMDowMCBFU1QiLA0KKyAgICAgICAgICAgICJGcmksIDIxIE5vdiAxOTk3IDA4OjAwOjAwIEVEVCIsDQorICAgICAgICAgICAgIkZyaSwgMjEgTm92IDE5OTcgMDY6MDA6MDAgQ1NUIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAwNzowMDowMCBDRFQiLA0KKyAgICAgICAgICAgICJGcmksIDIxIE5vdiAxOTk3IDA1OjAwOjAwIE1TVCIsDQorICAgICAgICAgICAgIkZyaSwgMjEgTm92IDE5OTcgMDY6MDA6MDAgTURUIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAwNDowMDowMCBQU1QiLA0KKyAgICAgICAgICAgICJGcmksIDIxIE5vdiAxOTk3IDA1OjAwOjAwIFBEVCIsDQorDQorICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG1pbGl0YXJ5IHpvbmVzIGFyZSBpZ25vcmVkLCBwZXIgUkZDMjgyMiBpbnN0cnVjdGlvbnMNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBBIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBCIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBDIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBEIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBFIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBGIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBHIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBIIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBJIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBLIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBMIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBNIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBOIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBPIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBQIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBRIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBSIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBTIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBUIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBVIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBWIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBXIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBYIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBZIiwNCisgICAgICAgICAgICAiRnJpLCAyMSBOb3YgMTk5NyAxMjowMDowMCBaIiwNCisgICAgICAgIH0pOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBlbnN1cmVBbGxFcXVhbChTdHJpbmdbXSBkYXRlU3RyaW5ncykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0ZVN0cmluZ3MubGVuZ3RoIC0gMTsgaSsrKSB7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IERhdGVUaW1lUGFyc2VyKG5ldyBTdHJpbmdSZWFkZXIoZGF0ZVN0cmluZ3NbaV0pKS5wYXJzZUFsbCgpLmdldERhdGUoKS5nZXRUaW1lKCksDQorICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZVRpbWVQYXJzZXIobmV3IFN0cmluZ1JlYWRlcihkYXRlU3RyaW5nc1tpICsgMV0pKS5wYXJzZUFsbCgpLmdldERhdGUoKS5nZXRUaW1lKCkNCisgICAgICAgICAgICApOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvbWltZXZlcnNpb24vTWltZVZlcnNpb25QYXJzZXJUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL21pbWV2ZXJzaW9uL01pbWVWZXJzaW9uUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMmU5YWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL21pbWV2ZXJzaW9uL01pbWVWZXJzaW9uUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQubWltZXZlcnNpb247CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLm1pbWV2ZXJzaW9uLnBhcnNlci5NaW1lVmVyc2lvblBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5taW1ldmVyc2lvbi5wYXJzZXIuUGFyc2VFeGNlcHRpb247CisKK3B1YmxpYyBjbGFzcyBNaW1lVmVyc2lvblBhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBsYWluTGluZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVjaygiMi40IiwgMiwgNCk7CisgICAgICAgIGNoZWNrKCIyNS4zNDQiLCAyNSwgMzQ0KTsKKyAgICAgICAgY2hlY2soIjAuMSIsIDAsIDEpOworICAgICAgICBjaGVjaygiMTIzMjM0MjM0LjAiLCAxMjMyMzQyMzQsIDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVdpdGhDb21tZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVjaygiMihBIGNvbW1lbnQpLjQiLCAyLCA0KTsKKyAgICAgICAgY2hlY2soIjIoLjgpLjQiLCAyLCA0KTsKKyAgICAgICAgY2hlY2soIihBIGNvbW1lbnQpMi40IiwgMiwgNCk7CisgICAgICAgIGNoZWNrKCIyLjQoQSBjb21tZW50KSIsIDIsIDQpOworICAgICAgICBjaGVjaygiMi4oQSBjb21tZW50KTQiLCAyLCA0KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdExpbmVXaXRoTmVzdGVkQ29tbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2soIjIoNC40NSAoIEFub3RoZXIgKCljb21tZW50ICgpIGJsYWggKFdvYmJsZShtaXgpKSlXaGF0ZXZlcikuNCIsIDIsIDQpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZSgiKFRoaXMgaXMganVzdCBhIGNvbW1lbnQpIik7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBleGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2hlY2soU3RyaW5nIGlucHV0LCBpbnQgZXhwZWN0ZWRNYWpvclZlcnNpb24sIGludCBleHBlY3RlZE1pbm9yVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1pbWVWZXJzaW9uUGFyc2VyIHBhcnNlciA9IHBhcnNlKGlucHV0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNYWpvciB2ZXJzaW9uIG51bWJlciIsIGV4cGVjdGVkTWFqb3JWZXJzaW9uLCBwYXJzZXIuZ2V0TWFqb3JWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1pbm9yIHZlcnNpb24gbnVtYmVyIiwgZXhwZWN0ZWRNaW5vclZlcnNpb24sIHBhcnNlci5nZXRNaW5vclZlcnNpb24oKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNaW1lVmVyc2lvblBhcnNlciBwYXJzZShTdHJpbmcgaW5wdXQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIE1pbWVWZXJzaW9uUGFyc2VyIHBhcnNlciA9IG5ldyBNaW1lVmVyc2lvblBhcnNlcihuZXcgU3RyaW5nUmVhZGVyKGlucHV0KSk7CisgICAgICAgIHBhcnNlci5wYXJzZUFsbCgpOworICAgICAgICByZXR1cm4gcGFyc2VyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovZmllbGQvc3RydWN0dXJlZC9TdHJ1Y3R1cmVkRmllbGRQYXJzZXJUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL3N0cnVjdHVyZWQvU3RydWN0dXJlZEZpZWxkUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMWQzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2ZpZWxkL3N0cnVjdHVyZWQvU3RydWN0dXJlZEZpZWxkUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuc3RydWN0dXJlZDsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuc3RydWN0dXJlZC5wYXJzZXIuU3RydWN0dXJlZEZpZWxkUGFyc2VyOworCitwdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZpZWxkUGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZyA9ICJGaWVsZCBWYWx1ZSI7CisgICAgICAgIGFzc2VydEVxdWFscyhzdHJpbmcsIHBhcnNlKHN0cmluZykpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nID0gIkZpZWxkIFZhbHVlIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0cmluZywgcGFyc2UoIiAgICBcdFxyXG4iICsgc3RyaW5nICsgIiAgXHRcclxuICAiKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb2xkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiRmllbGQgVmFsdWUiLCBwYXJzZSgiRmllbGQgXHRcclxuICBWYWx1ZSIpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFF1b3RlZFN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIkZpZWxkICAgIFZhbHVlIiwgcGFyc2UoIlwiRmllbGQgICAgVmFsdWVcIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaWVsZFx0XHJcblZhbHVlIiwgcGFyc2UoIlwiRmllbGRcdFxyXG5WYWx1ZVwiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZpZWxkXHRcclxuVmFsdWUiLCBwYXJzZSgiXCJGaWVsZFx0XHJcbiAgICAgICBcdCAgICAgICBWYWx1ZVwiIikpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaWVsZCIsIHBhcnNlKCJGaShUaGlzIGlzIGEgY29tbWVudCllbGQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmllbGQgVmFsdWUiLCBwYXJzZSgiRmkoVGhpcyBpcyBhIGNvbW1lbnQpZWxkIChBICh2ZXJ5IChuZXN0ZWQpICljb21tZW50KVZhbHVlIikpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVvdGVkSW5Db21tZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIkZpKFRoaXMgaXMgYSBjb21tZW50KWVsZCIsIHBhcnNlKCJcIkZpKFRoaXMgaXMgYSBjb21tZW50KWVsZFwiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZpZWxkIFZhbHVlIiwgcGFyc2UoIkZpKFRoaXMgaXMgYSBjb21tZW50KWVsZCAoQSAodmVyeSAobmVzdGVkKSApY29tbWVudClWYWx1ZSIpKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2UoU3RyaW5nIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RydWN0dXJlZEZpZWxkUGFyc2VyIHBhcnNlciA9IG5ldyBTdHJ1Y3R1cmVkRmllbGRQYXJzZXIobmV3IFN0cmluZ1JlYWRlcihpbikpOworICAgICAgICBwYXJzZXIuc2V0Rm9sZGluZ1ByZXNlcnZlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW1CdWZmZXJUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0J1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtQnVmZmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDY1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0J1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtQnVmZmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW1CdWZmZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRJbnB1dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdGV4dCA9ICJibGFoIGJsYWggeWFkYSB5YWRhIjsKKyAgICAgICAgYnl0ZVtdIGIxID0gdGV4dC5nZXRCeXRlcygiVVMtQVNDSUkiKTsKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAiYmxhaCI7CisgICAgICAgIGJ5dGVbXSBiMiA9IHBhdHRlcm4uZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGluYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiMSksIDQwOTYpOworICAgICAgICBpbmJ1ZmZlci5maWxsQnVmZmVyKCk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoJ2InLCBpbmJ1ZmZlci5yZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoJ2wnLCBpbmJ1ZmZlci5yZWFkKCkpOworICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluYnVmZmVyLmNoYXJBdCgxKTsKKyAgICAgICAgICAgIGZhaWwoIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmJ1ZmZlci5jaGFyQXQoMjApOworICAgICAgICAgICAgZmFpbCgiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluYnVmZmVyLmluZGV4T2YoYjIsIC0xLCAzKTsKKyAgICAgICAgICAgIGZhaWwoIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmJ1ZmZlci5pbmRleE9mKGIyLCAxLCAzKTsKKyAgICAgICAgICAgIGZhaWwoIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmJ1ZmZlci5pbmRleE9mKGIyLCAyLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5idWZmZXIuaW5kZXhPZihiMiwgMiwgMTgpOworICAgICAgICAgICAgZmFpbCgiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGluYnVmZmVyLmluZGV4T2YoYjIsIDIsIDE3KSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmJ1ZmZlci5pbmRleE9mKChieXRlKScgJywgLTEsIDMpOworICAgICAgICAgICAgZmFpbCgiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluYnVmZmVyLmluZGV4T2YoKGJ5dGUpJyAnLCAxLCAzKTsKKyAgICAgICAgICAgIGZhaWwoIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbmJ1ZmZlci5pbmRleE9mKChieXRlKScgJywgMiwgLTEpOworICAgICAgICAgICAgZmFpbCgiSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluYnVmZmVyLmluZGV4T2YoKGJ5dGUpJyAnLCAyLCAxOCk7CisgICAgICAgICAgICBmYWlsKCJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGluYnVmZmVyLmluZGV4T2YoKGJ5dGUpJ3knLCAyLCAxNykpOworICAgIH0KKyAgICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY09wZXJhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSAiYmxhIGJsYSB5YWRhIHlhZGEgaGFoYSBoYWhhIjsKKyAgICAgICAgYnl0ZVtdIGIxID0gdGV4dC5nZXRCeXRlcygiVVMtQVNDSUkiKTsKKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5idWZmZXIgPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIxKSwgNDA5Nik7CisgICAgICAgIGluYnVmZmVyLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluYnVmZmVyLnBvcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI3LCBpbmJ1ZmZlci5saW1pdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI3LCBpbmJ1ZmZlci5sZW5ndGgoKSk7CisKKyAgICAgICAgaW5idWZmZXIucmVhZCgpOworICAgICAgICBpbmJ1ZmZlci5yZWFkKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluYnVmZmVyLnBvcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI3LCBpbmJ1ZmZlci5saW1pdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI1LCBpbmJ1ZmZlci5sZW5ndGgoKSk7CisgICAgICAgIAorICAgICAgICBieXRlW10gdG1wMSA9IG5ldyBieXRlWzNdOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5idWZmZXIucmVhZCh0bXAxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGluYnVmZmVyLnBvcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI3LCBpbmJ1ZmZlci5saW1pdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIyLCBpbmJ1ZmZlci5sZW5ndGgoKSk7CisgICAgICAgIAorICAgICAgICBieXRlW10gdG1wMiA9IG5ldyBieXRlWzIyXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIyLCBpbmJ1ZmZlci5yZWFkKHRtcDIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjcsIGluYnVmZmVyLnBvcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI3LCBpbmJ1ZmZlci5saW1pdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluYnVmZmVyLmxlbmd0aCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGluYnVmZmVyLnJlYWQodG1wMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGluYnVmZmVyLnJlYWQodG1wMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGluYnVmZmVyLnJlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5idWZmZXIucmVhZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk1hdGNoaW5nMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdGV4dCA9ICJibGFibGEgZCBpcyB0aGUgd29yZCI7CisgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gImQiOworICAgICAgICBieXRlW10gYjEgPSB0ZXh0LmdldEJ5dGVzKCJVUy1BU0NJSSIpOworICAgICAgICBieXRlW10gYjIgPSBwYXR0ZXJuLmdldEJ5dGVzKCJVUy1BU0NJSSIpOworICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBpbmJ1ZmZlciA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYjEpLCA0MDk2KTsKKyAgICAgICAgaW5idWZmZXIuZmlsbEJ1ZmZlcigpOworICAgICAgICBpbnQgaSA9IGluYnVmZmVyLmluZGV4T2YoYjIpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgaSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTWF0Y2hpbmcyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gImRpc2RkaXNkaXNzZHNpZHNpZHNpaWQiOworICAgICAgICBTdHJpbmcgcGF0dGVybiA9ICJzaWlkIjsKKyAgICAgICAgYnl0ZVtdIGIxID0gdGV4dC5nZXRCeXRlcygiVVMtQVNDSUkiKTsKKyAgICAgICAgYnl0ZVtdIGIyID0gcGF0dGVybi5nZXRCeXRlcygiVVMtQVNDSUkiKTsKKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5idWZmZXIgPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIxKSwgNDA5Nik7CisgICAgICAgIGluYnVmZmVyLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgaW50IGkgPSBpbmJ1ZmZlci5pbmRleE9mKGIyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE4LCBpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5NYXRjaGluZzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSAiYmxhIGJsYSB5YWRhIHlhZGEgaGFoYSBoYWhhIjsKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSAiYmxhaCI7CisgICAgICAgIGJ5dGVbXSBiMSA9IHRleHQuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIGJ5dGVbXSBiMiA9IHBhdHRlcm4uZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGluYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiMSksIDQwOTYpOworICAgICAgICBpbmJ1ZmZlci5maWxsQnVmZmVyKCk7CisgICAgICAgIGludCBpID0gaW5idWZmZXIuaW5kZXhPZihiMik7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuTWF0Y2hpbmc0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gImJsYSBibGEgeWFkYSB5YWRhIGhhaGEgaGFoYSI7CisgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gImJsYSI7CisgICAgICAgIGJ5dGVbXSBiMSA9IHRleHQuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIGJ5dGVbXSBiMiA9IHBhdHRlcm4uZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGluYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiMSksIDQwOTYpOworICAgICAgICBpbmJ1ZmZlci5maWxsQnVmZmVyKCk7CisgICAgICAgIGludCBpID0gaW5idWZmZXIuaW5kZXhPZihiMik7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybk91dE9mQm91bmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSAiYmxhIGJsYSB5YWRhIHlhZGEgaGFoYSBoYWhhIjsKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4xID0gImJsYSBibGEiOworICAgICAgICBieXRlW10gYjEgPSB0ZXh0LmdldEJ5dGVzKCJVUy1BU0NJSSIpOworICAgICAgICBieXRlW10gYjIgPSBwYXR0ZXJuMS5nZXRCeXRlcygiVVMtQVNDSUkiKTsKKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5idWZmZXIgPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIxKSwgNDA5Nik7CisgICAgICAgIGluYnVmZmVyLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlWzNdOworICAgICAgICBpbmJ1ZmZlci5yZWFkKHRtcCk7CisgICAgICAgIGludCBpID0gaW5idWZmZXIuaW5kZXhPZihiMiwgaW5idWZmZXIucG9zKCksIGluYnVmZmVyLmxlbmd0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpKTsKKyAgICAgICAgaSA9IGluYnVmZmVyLmluZGV4T2YoYjIsIGluYnVmZmVyLnBvcygpLCBpbmJ1ZmZlci5sZW5ndGgoKSAtIDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyT3V0T2ZCb3VuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdGV4dCA9ICJ6enogYmxhaCBibGFoIGJsYWggZ2dnIjsKKyAgICAgICAgYnl0ZVtdIGIxID0gdGV4dC5nZXRCeXRlcygiVVMtQVNDSUkiKTsKKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5idWZmZXIgPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGIxKSwgNDA5Nik7CisgICAgICAgIGluYnVmZmVyLmZpbGxCdWZmZXIoKTsKKyAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlWzNdOworICAgICAgICBpbmJ1ZmZlci5yZWFkKHRtcCk7CisgICAgICAgIGludCBpID0gaW5idWZmZXIuaW5kZXhPZigoYnl0ZSkneicsIGluYnVmZmVyLnBvcygpLCBpbmJ1ZmZlci5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaSk7CisgICAgICAgIGkgPSBpbmJ1ZmZlci5pbmRleE9mKChieXRlKSdnJywgaW5idWZmZXIucG9zKCksIGluYnVmZmVyLmxlbmd0aCgpIC0gMyk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3QweEZGSW5CaW5hcnlTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGIxID0gbmV3IGJ5dGVbXSB7MSwgMiwgMywgKGJ5dGUpIDB4ZmYsIDEwLCAxLCAyLCAzfTsKKyAgICAgICAgYnl0ZVtdIGIyID0gbmV3IGJ5dGVbXSB7MTB9OworICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBpbmJ1ZmZlciA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYjEpLCA0MDk2KTsKKyAgICAgICAgaW5idWZmZXIuZmlsbEJ1ZmZlcigpOworICAgICAgICBpbnQgaSA9IGluYnVmZmVyLmluZGV4T2YoYjIpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgaSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9CdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbVRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0YjVlMwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW87CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5CdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5MaW5lUmVhZGVySW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uTWF4TGluZUxpbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQnl0ZUFycmF5QnVmZmVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY09wZXJhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRleHQgPSAiYWggYmxhaGJsYWgiOworICAgICAgICBieXRlW10gYjEgPSB0ZXh0LmdldEJ5dGVzKCJVUy1BU0NJSSIpOworICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYjEpLCA0MDk2KTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSknYScsIGluc3RyZWFtLnJlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSknaCcsIGluc3RyZWFtLnJlYWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSknICcsIGluc3RyZWFtLnJlYWQoKSk7CisKKyAgICAgICAgYnl0ZVtdIHRtcDEgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGluc3RyZWFtLnJlYWQodG1wMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgaW5zdHJlYW0ucmVhZCh0bXAxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpbnN0cmVhbS5yZWFkKHRtcDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpbnN0cmVhbS5yZWFkKHRtcDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpbnN0cmVhbS5yZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGluc3RyZWFtLnJlYWQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljUmVhZExpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ1tdIHRlc3RzdHJzID0gbmV3IFN0cmluZ1s1XTsKKyAgICAgICAgdGVzdHN0cnNbMF0gPSAiSGVsbG9cclxuIjsKKyAgICAgICAgdGVzdHN0cnNbMV0gPSAiVGhpcyBzdHJpbmcgc2hvdWxkIGJlIG11Y2ggbG9uZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlciAiICsKKyAgICAgICAgICAgICAgICAid2hpY2ggaXMgb25seSAxNiBieXRlcyBmb3IgdGhpcyB0ZXN0XHJcbiI7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE1OyBpKyspIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiMTIzNDU2Nzg5ICIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiYW5kIHN0dWZmIGxpa2UgdGhhdFxyXG4iKTsKKyAgICAgICAgdGVzdHN0cnNbMl0gPSBzYi50b1N0cmluZygpOworICAgICAgICB0ZXN0c3Ryc1szXSA9ICJcclxuIjsKKyAgICAgICAgdGVzdHN0cnNbNF0gPSAiQW5kIGdvb2RieWVcclxuIjsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0c3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAKKyAgICAgICAgZm9yIChTdHJpbmcgdGVzdHN0ciA6IHRlc3RzdHJzKSB7CisgICAgICAgICAgICBvdXRzdHJlYW0ud3JpdGUodGVzdHN0ci5nZXRCeXRlcygiVVMtQVNDSUkiKSk7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIHJhdyA9IG91dHN0cmVhbS50b0J5dGVBcnJheSgpOworICAgICAgICAKKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJhdyksIDE2KTsgCisgICAgICAgIAorICAgICAgICBCeXRlQXJyYXlCdWZmZXIgbGluZWJ1ZiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoOCk7IAorICAgICAgICBmb3IgKFN0cmluZyB0ZXN0c3RyIDogdGVzdHN0cnMpIHsKKyAgICAgICAgICAgIGxpbmVidWYuY2xlYXIoKTsKKyAgICAgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdHN0ciwgcyk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1ZikpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVtcHR5TGluZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHRlc3RzdHIgPSAiXG5cblxyXG5cclxyXG5cblxuXG5cblxuIjsKKyAgICAgICAgYnl0ZVtdIHJhdyA9IHRlc3RzdHIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIAorICAgICAgICBMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJhdyksIDQpOyAKKyAgICAgICAgCisgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBsaW5lYnVmID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcig4KTsgCisgICAgICAgIGxpbmVidWYuY2xlYXIoKTsKKyAgICAgICAgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1Zik7CisgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7CisgICAgICAgIAorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7CisgICAgICAgIAorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxyXG4iLCBzKTsKKworICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxyXHJcbiIsIHMpOworCisgICAgICAgIGxpbmVidWYuY2xlYXIoKTsKKyAgICAgICAgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1Zik7CisgICAgICAgIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7CisgICAgICAgIGFzc2VydEVxdWFscygiXG4iLCBzKTsKKworICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7CisKKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOworICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsKKyAgICAgICAgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHMpOworCisgICAgICAgIGxpbmVidWYuY2xlYXIoKTsKKyAgICAgICAgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1Zik7CisgICAgICAgIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7CisgICAgICAgIGFzc2VydEVxdWFscygiXG4iLCBzKTsKKworICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1ZikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRW1wdHlMaW5lTWF4TGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyB0ZXN0c3RyID0gIjEyMzQ1Njc4OTBcclxuIjsKKyAgICAgICAgYnl0ZVtdIHJhdyA9IHRlc3RzdHIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7CisgICAgICAgIAorICAgICAgICBMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5zdHJlYW0xID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXcpLCAxMDI0LCAxMyk7IAorICAgICAgICBCeXRlQXJyYXlCdWZmZXIgbGluZWJ1ZiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoOCk7IAorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtMS5yZWFkTGluZShsaW5lYnVmKTsKKworICAgICAgICBMaW5lUmVhZGVySW5wdXRTdHJlYW0gaW5zdHJlYW0yID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXcpLCAxMDI0LCAxMik7IAorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnN0cmVhbTIucmVhZExpbmUobGluZWJ1Zik7CisgICAgICAgICAgICBmYWlsKCJNYXhMaW5lTGltaXRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoTWF4TGluZUxpbWl0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vRU9MQ29udmVydGluZ0lucHV0U3RyZWFtVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9FT0xDb252ZXJ0aW5nSW5wdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0MTNjMAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vRU9MQ29udmVydGluZ0lucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pbzsNCisNCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5FT0xDb252ZXJ0aW5nSW5wdXRTdHJlYW07DQorDQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgRU9MQ29udmVydGluZ0lucHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisNCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgdGVzdENvbnZlcnRCb3RoKCJMaW5lIDFcclxuTGluZSAyXHJcbiIsICJMaW5lIDFcclxuTGluZSAyXHJcbiIpOw0KKyAgICAgICAgdGVzdENvbnZlcnRDUigiTGluZSAxXHJcbkxpbmUgMlxyXG4iLCAiTGluZSAxXHJcbkxpbmUgMlxyXG4iKTsNCisgICAgICAgIHRlc3RDb252ZXJ0TEYoIkxpbmUgMVxyXG5MaW5lIDJcclxuIiwgIkxpbmUgMVxyXG5MaW5lIDJcclxuIik7DQorICAgICAgICANCisgICAgICAgIHRlc3RDb252ZXJ0Qm90aCgiTGluZSAxXG5cckxpbmUgMlxuXHIiLCAiTGluZSAxXHJcblxyXG5MaW5lIDJcclxuXHJcbiIpOw0KKyAgICAgICAgdGVzdENvbnZlcnRDUigiTGluZSAxXG5cckxpbmUgMlxuXHIiLCAiTGluZSAxXG5cclxuTGluZSAyXG5cclxuIik7DQorICAgICAgICB0ZXN0Q29udmVydExGKCJMaW5lIDFcblxyTGluZSAyXG5cciIsICJMaW5lIDFcclxuXHJMaW5lIDJcclxuXHIiKTsNCisgICAgICAgIA0KKyAgICAgICAgdGVzdENvbnZlcnRCb3RoKCJMaW5lIDFcbkxpbmUgMlxuIiwgIkxpbmUgMVxyXG5MaW5lIDJcclxuIik7DQorICAgICAgICB0ZXN0Q29udmVydENSKCJMaW5lIDFcbkxpbmUgMlxuIiwgIkxpbmUgMVxuTGluZSAyXG4iKTsNCisgICAgICAgIHRlc3RDb252ZXJ0TEYoIkxpbmUgMVxuTGluZSAyXG4iLCAiTGluZSAxXHJcbkxpbmUgMlxyXG4iKTsNCisgICAgICAgIA0KKyAgICAgICAgdGVzdENvbnZlcnRCb3RoKCJMaW5lIDFcckxpbmUgMlxyIiwgIkxpbmUgMVxyXG5MaW5lIDJcclxuIik7DQorICAgICAgICB0ZXN0Q29udmVydENSKCJMaW5lIDFcckxpbmUgMlxyIiwgIkxpbmUgMVxyXG5MaW5lIDJcclxuIik7DQorICAgICAgICB0ZXN0Q29udmVydExGKCJMaW5lIDFcckxpbmUgMlxyIiwgIkxpbmUgMVxyTGluZSAyXHIiKTsNCisgICAgICAgIA0KKyAgICAgICAgdGVzdENvbnZlcnRCb3RoKCJcclxuIiwgIlxyXG4iKTsNCisgICAgICAgIHRlc3RDb252ZXJ0Q1IoIlxyXG4iLCAiXHJcbiIpOw0KKyAgICAgICAgdGVzdENvbnZlcnRMRigiXHJcbiIsICJcclxuIik7DQorICAgICAgICANCisgICAgICAgIHRlc3RDb252ZXJ0Qm90aCgiXG4iLCAiXHJcbiIpOw0KKyAgICAgICAgdGVzdENvbnZlcnRDUigiXG4iLCAiXG4iKTsNCisgICAgICAgIHRlc3RDb252ZXJ0TEYoIlxuIiwgIlxyXG4iKTsNCisgICAgICAgIA0KKyAgICAgICAgdGVzdENvbnZlcnRCb3RoKCJcciIsICJcclxuIik7DQorICAgICAgICB0ZXN0Q29udmVydENSKCJcciIsICJcclxuIik7DQorICAgICAgICB0ZXN0Q29udmVydExGKCJcciIsICJcciIpOw0KKyAgICAgICAgDQorICAgICAgICB0ZXN0Q29udmVydEJvdGgoIiIsICIiKTsNCisgICAgICAgIHRlc3RDb252ZXJ0Q1IoIiIsICIiKTsNCisgICAgICAgIHRlc3RDb252ZXJ0TEYoIiIsICIiKTsNCisgICAgfQ0KKw0KKyAgICBwcml2YXRlIHZvaWQgdGVzdENvbnZlcnRCb3RoKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTAyNF07DQorICAgICAgICANCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZnJvbVN0cmluZyhzMSkpOw0KKyAgICAgICAgRU9MQ29udmVydGluZ0lucHV0U3RyZWFtIGluID0gDQorICAgICAgICAgICAgbmV3IEVPTENvbnZlcnRpbmdJbnB1dFN0cmVhbShiYWlzLCANCisgICAgICAgICAgICAgICAgICAgICAgICBFT0xDb252ZXJ0aW5nSW5wdXRTdHJlYW0uQ09OVkVSVF9CT1RIKTsNCisgICAgICAgIGludCBuID0gaW4ucmVhZChieXRlcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoczIsIHRvU3RyaW5nKGJ5dGVzLCBuKSk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29udmVydENSKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTAyNF07DQorICAgICAgICANCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZnJvbVN0cmluZyhzMSkpOw0KKyAgICAgICAgRU9MQ29udmVydGluZ0lucHV0U3RyZWFtIGluID0gDQorICAgICAgICAgICAgbmV3IEVPTENvbnZlcnRpbmdJbnB1dFN0cmVhbShiYWlzLCANCisgICAgICAgICAgICAgICAgICAgICAgICBFT0xDb252ZXJ0aW5nSW5wdXRTdHJlYW0uQ09OVkVSVF9DUik7DQorICAgICAgICBpbnQgbiA9IGluLnJlYWQoYnl0ZXMpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMyLCB0b1N0cmluZyhieXRlcywgbikpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHZvaWQgdGVzdENvbnZlcnRMRihTdHJpbmcgczEsIFN0cmluZyBzMikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEwMjRdOw0KKyAgICAgICAgDQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZyb21TdHJpbmcoczEpKTsNCisgICAgICAgIEVPTENvbnZlcnRpbmdJbnB1dFN0cmVhbSBpbiA9IA0KKyAgICAgICAgICAgIG5ldyBFT0xDb252ZXJ0aW5nSW5wdXRTdHJlYW0oYmFpcywgDQorICAgICAgICAgICAgICAgICAgICAgICAgRU9MQ29udmVydGluZ0lucHV0U3RyZWFtLkNPTlZFUlRfTEYpOw0KKyAgICAgICAgaW50IG4gPSBpbi5yZWFkKGJ5dGVzKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhzMiwgdG9TdHJpbmcoYnl0ZXMsIG4pKTsNCisgICAgfQ0KKyAgICANCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmcoYnl0ZVtdIGIsIGludCBsZW4pIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgaWYgKGxlbiA9PSAtMSkgew0KKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGIsIDAsIGxlbiwgIlVTLUFTQ0lJIik7DQorICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgfSAgICANCisgICAgDQorICAgIHByaXZhdGUgYnl0ZVtdIGZyb21TdHJpbmcoU3RyaW5nIHMpIHsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgcmV0dXJuIHMuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7DQorICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCisgICAgICAgICAgICBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgfSAgICANCit9DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9MaW1pdGVkSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL0xpbWl0ZWRJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTc5ODIyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9MaW1pdGVkSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pbzsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIExpbWl0ZWRJbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXBUb0xpbWl0UmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnfTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7CisgICAgICAgIExpbWl0ZWRJbnB1dFN0cmVhbSBsaW1pdGVkU3RyZWFtID0gbmV3IExpbWl0ZWRJbnB1dFN0cmVhbShpbnN0cmVhbSwgMyk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBsaW1pdGVkU3RyZWFtLmdldFBvc2l0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxpbWl0ZWRTdHJlYW0ucmVhZCgpICE9IC0xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGxpbWl0ZWRTdHJlYW0uZ2V0UG9zaXRpb24oKSk7CisgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVszXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGxpbWl0ZWRTdHJlYW0ucmVhZCh0bXApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGxpbWl0ZWRTdHJlYW0uZ2V0UG9zaXRpb24oKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaW1pdGVkU3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxpbWl0ZWRTdHJlYW0ucmVhZCh0bXApOworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbGltaXRlZFN0cmVhbS5za2lwKDIpOworICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTGluZU51bWJlcklucHV0U3RyZWFtVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9MaW5lTnVtYmVySW5wdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmZlZmNkYQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTGluZU51bWJlcklucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvOw0KKw0KK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5MaW5lTnVtYmVySW5wdXRTdHJlYW07DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgTGluZU51bWJlcklucHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsNCisgICAgLyoqDQorICAgICAqIFRlc3RzIHRoYXQgcmVhZGluZyBzaW5nbGUgYnl0ZXMgdXBkYXRlcyB0aGUgbGluZSBudW1iZXIgYXBwcm9wcmlhdGVseS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkU2luZ2xlQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgcyA9ICJZYWRhXHJcbnlhZGFcclxueWFkYVxyXG4iOw0KKyAgICAgICAgTGluZU51bWJlcklucHV0U3RyZWFtIGlzID0gbmV3IExpbmVOdW1iZXJJbnB1dFN0cmVhbSgNCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSkpOw0KKw0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsNCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaXMuZ2V0TGluZU51bWJlcigpKTsNCisgICAgICAgICAgICBpcy5yZWFkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBmb3IgKGludCBpID0gNjsgaSA8IDEyOyBpKyspIHsNCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaXMuZ2V0TGluZU51bWJlcigpKTsNCisgICAgICAgICAgICBpcy5yZWFkKCk7DQorICAgICAgICB9DQorDQorICAgICAgICBmb3IgKGludCBpID0gMTI7IGkgPCAxODsgaSsrKSB7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGlzLmdldExpbmVOdW1iZXIoKSk7DQorICAgICAgICAgICAgaXMucmVhZCgpOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGlzLmdldExpbmVOdW1iZXIoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGlzLnJlYWQoKSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFRlc3RzIHRoYXQgcmVhZGluZyBtdWx0aXBsZSBieXRlcyBhdCBvbmNlIHVwZGF0ZXMgdGhlIGxpbmUgbnVtYmVyDQorICAgICAqIGFwcHJvcHJpYXRlbHkuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE1hbnlCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgcyA9ICJZYWRhXHJcbnlhZGFcclxueWFkYVxyXG4iOw0KKyAgICAgICAgTGluZU51bWJlcklucHV0U3RyZWFtIGlzID0gbmV3IExpbmVOdW1iZXJJbnB1dFN0cmVhbSgNCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMuZ2V0Qnl0ZXMoKSkpOw0KKw0KKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzRdOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlzLmdldExpbmVOdW1iZXIoKSk7DQorICAgICAgICBpcy5yZWFkKGJ1Zik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaXMuZ2V0TGluZU51bWJlcigpKTsNCisgICAgICAgIGlzLnJlYWQoYnVmKTsNCisgICAgICAgIGFzc2VydEVxdWFscygyLCBpcy5nZXRMaW5lTnVtYmVyKCkpOw0KKyAgICAgICAgaXMucmVhZChidWYpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGlzLmdldExpbmVOdW1iZXIoKSk7DQorICAgICAgICBpcy5yZWFkKGJ1Zik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMywgaXMuZ2V0TGluZU51bWJlcigpKTsNCisgICAgICAgIGlzLnJlYWQoYnVmKTsNCisgICAgICAgIGFzc2VydEVxdWFscyg0LCBpcy5nZXRMaW5lTnVtYmVyKCkpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpcy5yZWFkKCkpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvclRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MThjYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9MaW5lUmVhZGVySW5wdXRTdHJlYW1BZGFwdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5NYXhMaW5lTGltaXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5CeXRlQXJyYXlCdWZmZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNPcGVyYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gImFoIGJsYWhibGFoIjsKKyAgICAgICAgYnl0ZVtdIGIxID0gdGV4dC5nZXRCeXRlcygiVVMtQVNDSUkiKTsKKyAgICAgICAgCisgICAgICAgIExpbmVSZWFkZXJJbnB1dFN0cmVhbUFkYXB0b3IgaW5zdHJlYW0gPSBuZXcgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvcigKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYjEpKTsgCisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpJ2EnLCBpbnN0cmVhbS5yZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpJ2gnLCBpbnN0cmVhbS5yZWFkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpJyAnLCBpbnN0cmVhbS5yZWFkKCkpOworCisgICAgICAgIGJ5dGVbXSB0bXAxID0gbmV3IGJ5dGVbNF07CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBpbnN0cmVhbS5yZWFkKHRtcDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGluc3RyZWFtLnJlYWQodG1wMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZCh0bXAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZCh0bXAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBpbnN0cmVhbS5yZWFkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1JlYWRMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmdbXSB0ZXN0c3RycyA9IG5ldyBTdHJpbmdbNV07CisgICAgICAgIHRlc3RzdHJzWzBdID0gIkhlbGxvXHJcbiI7CisgICAgICAgIHRlc3RzdHJzWzFdID0gIlRoaXMgc3RyaW5nIHNob3VsZCBiZSBtdWNoIGxvbmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIgIiArCisgICAgICAgICAgICAgICAgIndoaWNoIGlzIG9ubHkgMTYgYnl0ZXMgZm9yIHRoaXMgdGVzdFxyXG4iOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNTsgaSsrKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjEyMzQ1Njc4OSAiKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoImFuZCBzdHVmZiBsaWtlIHRoYXRcclxuIik7CisgICAgICAgIHRlc3RzdHJzWzJdID0gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgdGVzdHN0cnNbM10gPSAiXHJcbiI7CisgICAgICAgIHRlc3RzdHJzWzRdID0gIkFuZCBnb29kYnllXHJcbiI7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoU3RyaW5nIHRlc3RzdHIgOiB0ZXN0c3RycykgeworICAgICAgICAgICAgb3V0c3RyZWFtLndyaXRlKHRlc3RzdHIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSByYXcgPSBvdXRzdHJlYW0udG9CeXRlQXJyYXkoKTsKKyAgICAgICAgCisgICAgICAgIExpbmVSZWFkZXJJbnB1dFN0cmVhbUFkYXB0b3IgaW5zdHJlYW0gPSBuZXcgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvcigKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmF3KSk7IAorICAgICAgICAKKyAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGxpbmVidWYgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDgpOyAKKyAgICAgICAgZm9yIChTdHJpbmcgdGVzdHN0ciA6IHRlc3RzdHJzKSB7CisgICAgICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsKKyAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RzdHIsIHMpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1ZikpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbXB0eUxpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyB0ZXN0c3RyID0gIlxuXG5cclxuXHJcclxuXG5cblxuXG5cbiI7CisgICAgICAgIGJ5dGVbXSByYXcgPSB0ZXN0c3RyLmdldEJ5dGVzKCJVUy1BU0NJSSIpOworICAgICAgICAKKyAgICAgICAgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvciBpbnN0cmVhbSA9IG5ldyBMaW5lUmVhZGVySW5wdXRTdHJlYW1BZGFwdG9yKAorICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXcpKTsgCisgICAgICAgIAorICAgICAgICBCeXRlQXJyYXlCdWZmZXIgbGluZWJ1ZiA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoOCk7IAorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHMpOworICAgICAgICAKKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOworICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsKKyAgICAgICAgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHMpOworICAgICAgICAKKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOworICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsKKyAgICAgICAgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcclxuIiwgcyk7CisKKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOworICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsKKyAgICAgICAgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcclxyXG4iLCBzKTsKKworICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7CisKKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOworICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsKKyAgICAgICAgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHMpOworCisgICAgICAgIGxpbmVidWYuY2xlYXIoKTsKKyAgICAgICAgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1Zik7CisgICAgICAgIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7CisgICAgICAgIGFzc2VydEVxdWFscygiXG4iLCBzKTsKKworICAgICAgICBsaW5lYnVmLmNsZWFyKCk7CisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7CisKKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOworICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsKKyAgICAgICAgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHMpOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1ZikpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVtcHR5TGluZU1heExpbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgdGVzdHN0ciA9ICIxMjM0NTY3ODkwXHJcbiI7CisgICAgICAgIGJ5dGVbXSByYXcgPSB0ZXN0c3RyLmdldEJ5dGVzKCJVUy1BU0NJSSIpOworICAgICAgICAKKyAgICAgICAgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvciBpbnN0cmVhbTEgPSBuZXcgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvcigKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmF3KSwgMTMpOyAKKyAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGxpbmVidWYgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDgpOyAKKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOworICAgICAgICBpbnN0cmVhbTEucmVhZExpbmUobGluZWJ1Zik7CisKKyAgICAgICAgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvciBpbnN0cmVhbTIgPSBuZXcgTGluZVJlYWRlcklucHV0U3RyZWFtQWRhcHRvcigKKyAgICAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmF3KSwgMTIpOyAKKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5zdHJlYW0yLnJlYWRMaW5lKGxpbmVidWYpOworICAgICAgICAgICAgZmFpbCgiTWF4TGluZUxpbWl0RXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKE1heExpbmVMaW1pdEV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL01pbWVCb3VuZGFyeUlucHV0U3RyZWFtVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9NaW1lQm91bmRhcnlJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWQwMGUyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9pby9NaW1lQm91bmRhcnlJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDM0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW87DQorDQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5CdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uTGluZVJlYWRlcklucHV0U3RyZWFtOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5NaW1lQm91bmRhcnlJbnB1dFN0cmVhbTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5CeXRlQXJyYXlCdWZmZXI7DQorDQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNSZWFkaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyB0ZXh0ID0gIkxpbmUgMVxyXG5MaW5lIDJcclxuLS1ib3VuZGFyeVxyXG4iICsNCisgICAgICAgICAgICAgICAgIkxpbmUgM1xyXG5MaW5lIDRcclxuLS1ib3VuZGFyeS0tIjsNCisgICAgICAgIA0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRleHQuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOw0KKyAgICAgICAgDQorICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0oYmlzLCA0MDk2KTsgDQorICAgICAgICANCisgICAgICAgIE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtIG1pbWUxID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGJ1ZmZlciwgImJvdW5kYXJ5Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgMVxyXG5MaW5lIDIiLCByZWFkKG1pbWUxLCA1KSk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEZhbHNlKG1pbWUxLmlzTGFzdFBhcnQoKSk7DQorICAgICAgICANCisgICAgICAgIE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtIG1pbWUyID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGJ1ZmZlciwgImJvdW5kYXJ5Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgM1xyXG5MaW5lIDQiLCByZWFkKG1pbWUyLCA1KSk7DQorDQorICAgICAgICBhc3NlcnRUcnVlKG1pbWUyLmlzTGFzdFBhcnQoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RMZW5pZW50TGluZURlbGltaXRlclJlYWRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIHRleHQgPSAiTGluZSAxXHJcbkxpbmUgMlxuLS1ib3VuZGFyeVxuIiArDQorICAgICAgICAgICAgICAgICJMaW5lIDNcclxuTGluZSA0XG4tLWJvdW5kYXJ5LS1cbiI7DQorICAgICAgICANCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsNCisgICAgICAgIA0KKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKGJpcywgNDA5Nik7IA0KKyAgICAgICAgDQorICAgICAgICBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbSBtaW1lMSA9IG5ldyBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbShidWZmZXIsICJib3VuZGFyeSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaW5lIDFcclxuTGluZSAyIiwgcmVhZChtaW1lMSwgNSkpOw0KKyAgICAgICAgDQorICAgICAgICBhc3NlcnRGYWxzZShtaW1lMS5pc0xhc3RQYXJ0KCkpOw0KKyAgICAgICAgDQorICAgICAgICBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbSBtaW1lMiA9IG5ldyBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbShidWZmZXIsICJib3VuZGFyeSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaW5lIDNcclxuTGluZSA0IiwgcmVhZChtaW1lMiwgNSkpOw0KKw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtaW1lMi5pc0xhc3RQYXJ0KCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNSZWFkaW5nU21hbGxCdWZmZXIxKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyB0ZXh0ID0gInlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGFcclxuLS1ib3VuZGFyeVxyXG4iICsNCisgICAgICAgICAgICAgICAgImJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaFxyXG4tLWJvdW5kYXJ5LS0iOw0KKyAgICAgICAgDQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcygiVVMtQVNDSUkiKSk7DQorICAgICAgICANCisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGJ1ZmZlciA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbShiaXMsIDIwKTsgDQorICAgICAgICANCisgICAgICAgIE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtIG1pbWUxID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGJ1ZmZlciwgImJvdW5kYXJ5Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGEiLCANCisgICAgICAgICAgICAgICAgcmVhZChtaW1lMSwgMTApKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RmFsc2UobWltZTEuaXNMYXN0UGFydCgpKTsNCisgICAgICAgIA0KKyAgICAgICAgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0gbWltZTIgPSBuZXcgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0oYnVmZmVyLCAiYm91bmRhcnkiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoIiwgDQorICAgICAgICAgICAgICAgIHJlYWQobWltZTIsIDEwKSk7DQorDQorICAgICAgICBhc3NlcnRUcnVlKG1pbWUyLmlzTGFzdFBhcnQoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1JlYWRpbmdTbWFsbEJ1ZmZlcjIoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIHRleHQgPSAieWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYVxyXG4tLWJvdW5kYXJ5XHJcbiIgKw0KKyAgICAgICAgICAgICAgICAiYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoXHJcbi0tYm91bmRhcnktLSI7DQorICAgICAgICANCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsNCisgICAgICAgIA0KKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKGJpcywgMjApOyANCisgICAgICAgIA0KKyAgICAgICAgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0gbWltZTEgPSBuZXcgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0oYnVmZmVyLCAiYm91bmRhcnkiKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRheWFkYXlhZGF5YWRhIiwgDQorICAgICAgICAgICAgICAgIHJlYWQobWltZTEsIDI1KSk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEZhbHNlKG1pbWUxLmlzTGFzdFBhcnQoKSk7DQorICAgICAgICANCisgICAgICAgIE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtIG1pbWUyID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGJ1ZmZlciwgImJvdW5kYXJ5Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaGJsYWhibGFoYmxhaCIsIA0KKyAgICAgICAgICAgICAgICByZWFkKG1pbWUyLCAyNSkpOw0KKw0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtaW1lMi5pc0xhc3RQYXJ0KCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNSZWFkaW5nQnlPbmVCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyB0ZXh0ID0gIkxpbmUgMVxyXG5MaW5lIDJcclxuLS1ib3VuZGFyeVxyXG4iICsNCisgICAgICAgICAgICAgICAgIkxpbmUgM1xyXG5MaW5lIDRcclxuLS1ib3VuZGFyeS0tIjsNCisgICAgICAgIA0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRleHQuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOw0KKyAgICAgICAgDQorICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0oYmlzLCA0MDk2KTsgDQorICAgICAgICANCisgICAgICAgIE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtIG1pbWUxID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGJ1ZmZlciwgImJvdW5kYXJ5Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgMVxyXG5MaW5lIDIiLCByZWFkQnlPbmVCeXRlKG1pbWUxKSk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEZhbHNlKG1pbWUxLmlzTGFzdFBhcnQoKSk7DQorICAgICAgICANCisgICAgICAgIE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtIG1pbWUyID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGJ1ZmZlciwgImJvdW5kYXJ5Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkxpbmUgM1xyXG5MaW5lIDQiLCByZWFkQnlPbmVCeXRlKG1pbWUyKSk7DQorDQorICAgICAgICBhc3NlcnRUcnVlKG1pbWUyLmlzTGFzdFBhcnQoKSk7DQorICAgIH0NCisgICAgDQorICAgIC8qKg0KKyAgICAgKiBUZXN0cyB0aGF0IGEgQ1JMRiBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYSBib3VuZGFyeSBpc24ndCBpbmNsdWRlZCBpbg0KKyAgICAgKiB0aGUgc3RyZWFtLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdENSTEZQcmVjZWRpbmdCb3VuZGFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgdGV4dCA9ICJMaW5lIDFcclxuTGluZSAyXHJcbi0tYm91bmRhcnlcclxuIiArDQorICAgICAgICAgICAgICAgICJMaW5lIDNcclxuTGluZSA0XHJcblxyXG4tLWJvdW5kYXJ5XHJcbiI7DQorICAgICAgICANCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsNCisgICAgICAgIA0KKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKGJpcywgNDA5Nik7IA0KKyAgICAgICAgDQorICAgICAgICBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbSBtaW1lMSA9IG5ldyBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbShidWZmZXIsICJib3VuZGFyeSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaW5lIDFcclxuTGluZSAyIiwgcmVhZChtaW1lMSwgNSkpOw0KKyAgICAgICAgDQorICAgICAgICBhc3NlcnRGYWxzZShtaW1lMS5pc0xhc3RQYXJ0KCkpOw0KKyAgICAgICAgDQorICAgICAgICBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbSBtaW1lMiA9IG5ldyBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbShidWZmZXIsICJib3VuZGFyeSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMaW5lIDNcclxuTGluZSA0XHJcbiIsIHJlYWQobWltZTIsIDUpKTsNCisNCisgICAgICAgIGFzc2VydEZhbHNlKG1pbWUyLmlzTGFzdFBhcnQoKSk7DQorICAgIH0NCisgICAgDQorICAgIHByaXZhdGUgU3RyaW5nIHJlYWRCeU9uZUJ5dGUoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGludCBiID0gMDsNCisgICAgICAgIHdoaWxlICgoYiA9IGlzLnJlYWQoKSkgIT0gLTEpIHsNCisgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7DQorICAgIH0NCisNCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVhZChJbnB1dFN0cmVhbSBpcywgaW50IGJ1ZnNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGludCBsOw0KKyAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2J1ZnNpemVdOw0KKyAgICAgICAgd2hpbGUgKChsID0gaXMucmVhZCh0bXApKSAhPSAtMSkgew0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbDsgaSsrKSB7DQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgdG1wW2ldKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoqDQorICAgICAqIFRlc3RzIHRoYXQgYSBzdHJlYW0gY29udGFpbmluZyBvbmx5IGEgYm91bmRhcnkgaXMgZW1wdHkuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1tZWRpYXRlQm91bmRhcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIHRleHQgPSAiLS1ib3VuZGFyeVxyXG4iOw0KKyAgICAgICAgDQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcygpKTsNCisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGJ1ZmZlciA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbShiaXMsIDQwOTYpOyANCisgICAgICAgIA0KKyAgICAgICAgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0gc3RyZWFtID0gDQorICAgICAgICAgICAgbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGJ1ZmZlciwgImJvdW5kYXJ5Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHN0cmVhbS5yZWFkKCkpOw0KKyAgICAgICAgDQorICAgICAgICB0ZXh0ID0gIlxyXG4tLWJvdW5kYXJ5XHJcbiI7DQorICAgICAgICANCisgICAgICAgIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCkpOw0KKyAgICAgICAgYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKGJpcywgNDA5Nik7IA0KKyAgICAgICAgc3RyZWFtID0gDQorICAgICAgICAgICAgbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGJ1ZmZlciwgImJvdW5kYXJ5Iik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHN0cmVhbS5yZWFkKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogVGVzdHMgdGhhdCBoYXNNb3JlUGFydHMgYmVoYXZlIGFzIGV4cGVjdGVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdEhhc01vcmVQYXJ0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgdGV4dCA9ICItLWJvdW5kYXJ5LS1cclxuIjsNCisgICAgICAgIA0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRleHQuZ2V0Qnl0ZXMoKSk7DQorICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0oYmlzLCA0MDk2KTsgDQorICAgICAgICBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbSBzdHJlYW0gPSANCisgICAgICAgICAgICBuZXcgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0oYnVmZmVyLCAiYm91bmRhcnkiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc3RyZWFtLnJlYWQoKSk7DQorICAgICAgICBhc3NlcnRUcnVlKHN0cmVhbS5pc0xhc3RQYXJ0KCkpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKioNCisgICAgICogVGVzdHMgdGhhdCBhIHN0cmVhbSBjb250YWluaW5nIG9ubHkgYSBib3VuZGFyeSBpcyBlbXB0eS4NCisgICAgICovDQorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVmaXhJc0JvdW5kYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyB0ZXh0ID0gIkxpbmUgMVxyXG5cclxuLS1ib3VuZGFyeXlhZGFcclxuIjsNCisgICAgICAgIA0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRleHQuZ2V0Qnl0ZXMoKSk7DQorICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0oYmlzLCA0MDk2KTsgDQorICAgICAgICBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbSBzdHJlYW0gPSANCisgICAgICAgICAgICBuZXcgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0oYnVmZmVyLCAiYm91bmRhcnkiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiTGluZSAxXHJcbiIsIHJlYWQoc3RyZWFtLCAxMDApKTsNCisgICAgICAgIA0KKyAgICAgICAgdGV4dCA9ICItLWJvdW5kYXJ5eWFkYVxyXG4iOw0KKyAgICAgICAgDQorICAgICAgICBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcygpKTsNCisgICAgICAgIGJ1ZmZlciA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbShiaXMsIDQwOTYpOyANCisgICAgICAgIHN0cmVhbSA9IG5ldyBNaW1lQm91bmRhcnlJbnB1dFN0cmVhbShidWZmZXIsICJib3VuZGFyeSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBzdHJlYW0ucmVhZCgpKTsNCisgICAgfQ0KKyAgICANCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1JlYWRMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICANCisgICAgICAgIFN0cmluZ1tdIHRlc3RzdHJzID0gbmV3IFN0cmluZ1s1XTsNCisgICAgICAgIHRlc3RzdHJzWzBdID0gIkhlbGxvXHJcbiI7DQorICAgICAgICB0ZXN0c3Ryc1sxXSA9ICJUaGlzIHN0cmluZyBzaG91bGQgYmUgbXVjaCBsb25nZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyICIgKw0KKyAgICAgICAgICAgICAgICAid2hpY2ggaXMgb25seSAyMCBieXRlcyBmb3IgdGhpcyB0ZXN0XHJcbiI7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykgew0KKyAgICAgICAgICAgIHNiLmFwcGVuZCgiMTIzNDU2Nzg5ICIpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgc2IuYXBwZW5kKCJhbmQgc3R1ZmYgbGlrZSB0aGF0XHJcbiIpOw0KKyAgICAgICAgdGVzdHN0cnNbMl0gPSBzYi50b1N0cmluZygpOw0KKyAgICAgICAgdGVzdHN0cnNbM10gPSAiXHJcbiI7DQorICAgICAgICB0ZXN0c3Ryc1s0XSA9ICJBbmQgZ29vZGJ5ZVxyXG4iOw0KKw0KKyAgICAgICAgU3RyaW5nIHRlcm0gPSAiXHJcbi0tMTIzNFxyXG4iOw0KKyAgICAgICAgDQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0c3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICAgICAgDQorICAgICAgICBmb3IgKFN0cmluZyB0ZXN0c3RyIDogdGVzdHN0cnMpIHsNCisgICAgICAgICAgICBvdXRzdHJlYW0ud3JpdGUodGVzdHN0ci5nZXRCeXRlcygiVVMtQVNDSUkiKSk7DQorICAgICAgICB9DQorICAgICAgICBvdXRzdHJlYW0ud3JpdGUodGVybS5nZXRCeXRlcygiVVMtQVNDSUkiKSk7DQorICAgICAgICBieXRlW10gcmF3ID0gb3V0c3RyZWFtLnRvQnl0ZUFycmF5KCk7DQorICAgICAgICANCisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGluYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXcpLCAyMCk7IA0KKyAgICAgICAgTGluZVJlYWRlcklucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGluYnVmZmVyLCAiMTIzNCIpOyANCisgICAgICAgIA0KKyAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGxpbmVidWYgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDgpOyANCisgICAgICAgIGZvciAoU3RyaW5nIHRlc3RzdHIgOiB0ZXN0c3Rycykgew0KKyAgICAgICAgICAgIGxpbmVidWYuY2xlYXIoKTsNCisgICAgICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsNCisgICAgICAgICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsNCisgICAgICAgICAgICBhc3NlcnRFcXVhbHModGVzdHN0ciwgcyk7DQorICAgICAgICB9DQorICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1ZikpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVtcHR5TGluZSgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgDQorICAgICAgICBTdHJpbmcgdGVzdHN0ciA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OVxuXG5cclxuXHJcclxuXG5cblxuXG5cbi0tMTIzNFxyXG4iOw0KKyAgICAgICAgYnl0ZVtdIHJhdyA9IHRlc3RzdHIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7DQorICAgICAgICANCisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIGluYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXcpLCAyMCk7IA0KKyAgICAgICAgTGluZVJlYWRlcklucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IE1pbWVCb3VuZGFyeUlucHV0U3RyZWFtKGluYnVmZmVyLCAiMTIzNCIpOyANCisgICAgICAgIA0KKyAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGxpbmVidWYgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDgpOyANCisgICAgICAgIGxpbmVidWYuY2xlYXIoKTsNCisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOw0KKyAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkwMTIzNDU2Nzg5XG4iLCBzKTsNCisgICAgICAgIA0KKyAgICAgICAgbGluZWJ1Zi5jbGVhcigpOw0KKyAgICAgICAgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1Zik7DQorICAgICAgICBzID0gbmV3IFN0cmluZyhsaW5lYnVmLnRvQnl0ZUFycmF5KCksICJVUy1BU0NJSSIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcbiIsIHMpOw0KKyAgICAgICAgDQorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7DQorICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsNCisgICAgICAgIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlxyXG4iLCBzKTsNCisNCisgICAgICAgIGxpbmVidWYuY2xlYXIoKTsNCisgICAgICAgIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpOw0KKyAgICAgICAgcyA9IG5ldyBTdHJpbmcobGluZWJ1Zi50b0J5dGVBcnJheSgpLCAiVVMtQVNDSUkiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiXHJcclxuIiwgcyk7DQorDQorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7DQorICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsNCisgICAgICAgIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7DQorDQorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7DQorICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsNCisgICAgICAgIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7DQorDQorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7DQorICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsNCisgICAgICAgIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7DQorDQorICAgICAgICBsaW5lYnVmLmNsZWFyKCk7DQorICAgICAgICBpbnN0cmVhbS5yZWFkTGluZShsaW5lYnVmKTsNCisgICAgICAgIHMgPSBuZXcgU3RyaW5nKGxpbmVidWYudG9CeXRlQXJyYXkoKSwgIlVTLUFTQ0lJIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIlxuIiwgcyk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGluc3RyZWFtLnJlYWRMaW5lKGxpbmVidWYpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5zdHJlYW0ucmVhZExpbmUobGluZWJ1ZikpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Ym91bmRhcnlMb25nZXJUaGFuQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyB0ZXh0ID0gIi0tbG9vb29vb29vb29vb29vb29vb29vb29vb29vb25nLWJvdW5kYXJ5XHJcbiI7DQorICAgICAgICANCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXh0LmdldEJ5dGVzKCkpOw0KKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKGJpcywgMTApOyANCisgICAgICAgIA0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBuZXcgTWltZUJvdW5kYXJ5SW5wdXRTdHJlYW0oYnVmZmVyLCAibG9vb29vb29vb29vb29vb29vb29vb29vb29vb25nLWJvdW5kYXJ5Iik7DQorICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7DQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL1Bvc2l0aW9uSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL2lvL1Bvc2l0aW9uSW5wdXRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjNTQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovaW8vUG9zaXRpb25JbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgUG9zaXRpb25JbnB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zaXRpb25Db3VudGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnfTsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSk7CisgICAgICAgIFBvc2l0aW9uSW5wdXRTdHJlYW0gY291bnRpbmdTdHJlYW0gPSBuZXcgUG9zaXRpb25JbnB1dFN0cmVhbShpbnN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjb3VudGluZ1N0cmVhbS5nZXRQb3NpdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudGluZ1N0cmVhbS5yZWFkKCkgIT0gLTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY291bnRpbmdTdHJlYW0uZ2V0UG9zaXRpb24oKSk7CisgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVszXTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGNvdW50aW5nU3RyZWFtLnJlYWQodG1wKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBjb3VudGluZ1N0cmVhbS5nZXRQb3NpdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvdW50aW5nU3RyZWFtLnNraXAoMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgY291bnRpbmdTdHJlYW0uZ2V0UG9zaXRpb24oKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRpbmdTdHJlYW0ucmVhZCgpICE9IC0xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGNvdW50aW5nU3RyZWFtLmdldFBvc2l0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50aW5nU3RyZWFtLnJlYWQoKSA9PSAtMSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBjb3VudGluZ1N0cmVhbS5nZXRQb3NpdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb3VudGluZ1N0cmVhbS5yZWFkKCkgPT0gLTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgY291bnRpbmdTdHJlYW0uZ2V0UG9zaXRpb24oKSk7CisgICAgICAgIGFzc2VydFRydWUoY291bnRpbmdTdHJlYW0ucmVhZCh0bXApID09IC0xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGNvdW50aW5nU3RyZWFtLmdldFBvc2l0aW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvdW50aW5nU3RyZWFtLnJlYWQodG1wKSA9PSAtMSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBjb3VudGluZ1N0cmVhbS5nZXRQb3NpdGlvbigpKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvQ29weUNvbnN0cnVjdG9yVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0NvcHlDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTRhMGYwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0NvcHlDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkFic3RyYWN0RmllbGQ7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkZpZWxkOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ29weUNvbnN0cnVjdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5RW1wdHlNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2Ugb3JpZ2luYWwgPSBuZXcgTWVzc2FnZSgpOworCisgICAgICAgIE1lc3NhZ2UgY29weSA9IG5ldyBNZXNzYWdlKG9yaWdpbmFsKTsKKworICAgICAgICBhc3NlcnROdWxsKGNvcHkuZ2V0SGVhZGVyKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvcHkuZ2V0Qm9keSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3B5LmdldFBhcmVudCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weU1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVzc2FnZSBwYXJlbnQgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICBCb2R5IGJvZHkgPSBuZXcgQm9keUZhY3RvcnkoKS50ZXh0Qm9keSgidGVzdCIpOworCisgICAgICAgIE1lc3NhZ2Ugb3JpZ2luYWwgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICBvcmlnaW5hbC5zZXRIZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgb3JpZ2luYWwuc2V0Qm9keShib2R5KTsKKyAgICAgICAgb3JpZ2luYWwuc2V0UGFyZW50KHBhcmVudCk7CisKKyAgICAgICAgTWVzc2FnZSBjb3B5ID0gbmV3IE1lc3NhZ2Uob3JpZ2luYWwpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoY29weS5nZXRIZWFkZXIoKSk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoaGVhZGVyLCBjb3B5LmdldEhlYWRlcigpKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGNvcHkuZ2V0Qm9keSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShib2R5LCBjb3B5LmdldEJvZHkoKSk7CisKKyAgICAgICAgYXNzZXJ0U2FtZShjb3B5LCBjb3B5LmdldEJvZHkoKS5nZXRQYXJlbnQoKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChjb3B5LmdldFBhcmVudCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weUVtcHR5Qm9keVBhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQm9keVBhcnQgb3JpZ2luYWwgPSBuZXcgQm9keVBhcnQoKTsKKworICAgICAgICBCb2R5UGFydCBjb3B5ID0gbmV3IEJvZHlQYXJ0KG9yaWdpbmFsKTsKKworICAgICAgICBhc3NlcnROdWxsKGNvcHkuZ2V0SGVhZGVyKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvcHkuZ2V0Qm9keSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3B5LmdldFBhcmVudCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weUJvZHlQYXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgcGFyZW50ID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgQm9keSBib2R5ID0gbmV3IEJvZHlGYWN0b3J5KCkudGV4dEJvZHkoInRlc3QiKTsKKworICAgICAgICBCb2R5UGFydCBvcmlnaW5hbCA9IG5ldyBCb2R5UGFydCgpOworICAgICAgICBvcmlnaW5hbC5zZXRIZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgb3JpZ2luYWwuc2V0Qm9keShib2R5KTsKKyAgICAgICAgb3JpZ2luYWwuc2V0UGFyZW50KHBhcmVudCk7CisKKyAgICAgICAgQm9keVBhcnQgY29weSA9IG5ldyBCb2R5UGFydChvcmlnaW5hbCk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb3B5LmdldEhlYWRlcigpKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShoZWFkZXIsIGNvcHkuZ2V0SGVhZGVyKCkpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoY29weS5nZXRCb2R5KCkpOworICAgICAgICBhc3NlcnROb3RTYW1lKGJvZHksIGNvcHkuZ2V0Qm9keSgpKTsKKworICAgICAgICBhc3NlcnRTYW1lKGNvcHksIGNvcHkuZ2V0Qm9keSgpLmdldFBhcmVudCgpKTsKKworICAgICAgICBhc3NlcnROdWxsKGNvcHkuZ2V0UGFyZW50KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5RW1wdHlNdWx0aXBhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTXVsdGlwYXJ0IG9yaWdpbmFsID0gbmV3IE11bHRpcGFydCgibWl4ZWQiKTsKKworICAgICAgICBNdWx0aXBhcnQgY29weSA9IG5ldyBNdWx0aXBhcnQob3JpZ2luYWwpOworCisgICAgICAgIGFzc2VydFNhbWUob3JpZ2luYWwuZ2V0UHJlYW1ibGUoKSwgY29weS5nZXRQcmVhbWJsZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShvcmlnaW5hbC5nZXRFcGlsb2d1ZSgpLCBjb3B5LmdldEVwaWxvZ3VlKCkpOworICAgICAgICBhc3NlcnRTYW1lKG9yaWdpbmFsLmdldFN1YlR5cGUoKSwgY29weS5nZXRTdWJUeXBlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvcHkuZ2V0Qm9keVBhcnRzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3B5LmdldFBhcmVudCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weU11bHRpcGFydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIHBhcmVudCA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIEJvZHlQYXJ0IGJvZHlQYXJ0ID0gbmV3IEJvZHlQYXJ0KCk7CisKKyAgICAgICAgTXVsdGlwYXJ0IG9yaWdpbmFsID0gbmV3IE11bHRpcGFydCgibWl4ZWQiKTsKKyAgICAgICAgb3JpZ2luYWwuc2V0UHJlYW1ibGUoInByZWFtYmxlIik7CisgICAgICAgIG9yaWdpbmFsLnNldEVwaWxvZ3VlKCJlcGlsb2d1ZSIpOworICAgICAgICBvcmlnaW5hbC5zZXRQYXJlbnQocGFyZW50KTsKKyAgICAgICAgb3JpZ2luYWwuYWRkQm9keVBhcnQoYm9keVBhcnQpOworCisgICAgICAgIE11bHRpcGFydCBjb3B5ID0gbmV3IE11bHRpcGFydChvcmlnaW5hbCk7CisKKyAgICAgICAgYXNzZXJ0U2FtZShvcmlnaW5hbC5nZXRQcmVhbWJsZSgpLCBjb3B5LmdldFByZWFtYmxlKCkpOworICAgICAgICBhc3NlcnRTYW1lKG9yaWdpbmFsLmdldEVwaWxvZ3VlKCksIGNvcHkuZ2V0RXBpbG9ndWUoKSk7CisgICAgICAgIGFzc2VydFNhbWUob3JpZ2luYWwuZ2V0U3ViVHlwZSgpLCBjb3B5LmdldFN1YlR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb3B5LmdldEJvZHlQYXJ0cygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydE51bGwoY29weS5nZXRQYXJlbnQoKSk7CisKKyAgICAgICAgQm9keVBhcnQgYm9keVBhcnRDb3B5ID0gY29weS5nZXRCb2R5UGFydHMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShib2R5UGFydCwgYm9keVBhcnRDb3B5KTsKKworICAgICAgICBhc3NlcnRTYW1lKHBhcmVudCwgYm9keVBhcnQuZ2V0UGFyZW50KCkpOworICAgICAgICBhc3NlcnROdWxsKGJvZHlQYXJ0Q29weS5nZXRQYXJlbnQoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcHlNdWx0aXBhcnRNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJvZHlQYXJ0IGJvZHlQYXJ0MSA9IG5ldyBCb2R5UGFydCgpOworICAgICAgICBCb2R5UGFydCBib2R5UGFydDIgPSBuZXcgQm9keVBhcnQoKTsKKworICAgICAgICBNdWx0aXBhcnQgbXVsdGlwYXJ0ID0gbmV3IE11bHRpcGFydCgibWl4ZWQiKTsKKyAgICAgICAgbXVsdGlwYXJ0LmFkZEJvZHlQYXJ0KGJvZHlQYXJ0MSk7CisgICAgICAgIG11bHRpcGFydC5hZGRCb2R5UGFydChib2R5UGFydDIpOworCisgICAgICAgIE1lc3NhZ2Ugb3JpZ2luYWwgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICBvcmlnaW5hbC5zZXRIZWFkZXIobmV3IEhlYWRlcigpKTsKKyAgICAgICAgb3JpZ2luYWwuc2V0Qm9keShtdWx0aXBhcnQpOworCisgICAgICAgIE1lc3NhZ2UgY29weSA9IG5ldyBNZXNzYWdlKG9yaWdpbmFsKTsKKworICAgICAgICBNdWx0aXBhcnQgbXVsdGlwYXJ0Q29weSA9IChNdWx0aXBhcnQpIGNvcHkuZ2V0Qm9keSgpOworICAgICAgICBMaXN0PEJvZHlQYXJ0PiBib2R5UGFydHMgPSBtdWx0aXBhcnRDb3B5LmdldEJvZHlQYXJ0cygpOworICAgICAgICBCb2R5UGFydCBib2R5UGFydENvcHkxID0gYm9keVBhcnRzLmdldCgwKTsKKyAgICAgICAgQm9keVBhcnQgYm9keVBhcnRDb3B5MiA9IGJvZHlQYXJ0cy5nZXQoMSk7CisKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShib2R5UGFydDEsIGJvZHlQYXJ0Q29weTEpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwsIGJvZHlQYXJ0MS5nZXRQYXJlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhjb3B5LCBib2R5UGFydENvcHkxLmdldFBhcmVudCgpKTsKKworICAgICAgICBhc3NlcnROb3RTYW1lKGJvZHlQYXJ0MiwgYm9keVBhcnRDb3B5Mik7CisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbCwgYm9keVBhcnQyLmdldFBhcmVudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvcHksIGJvZHlQYXJ0Q29weTIuZ2V0UGFyZW50KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpZWxkIGYxID0gQWJzdHJhY3RGaWVsZC5wYXJzZSgibmFtZTE6IHZhbHVlMSIpOworICAgICAgICBGaWVsZCBmMiA9IEFic3RyYWN0RmllbGQucGFyc2UoIm5hbWUyOiB2YWx1ZSIpOworICAgICAgICBGaWVsZCBmMyA9IEFic3RyYWN0RmllbGQucGFyc2UoIm5hbWUxOiB2YWx1ZTIiKTsKKworICAgICAgICBIZWFkZXIgb3JpZ2luYWwgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgIG9yaWdpbmFsLmFkZEZpZWxkKGYxKTsKKyAgICAgICAgb3JpZ2luYWwuYWRkRmllbGQoZjIpOworICAgICAgICBvcmlnaW5hbC5hZGRGaWVsZChmMyk7CisKKyAgICAgICAgSGVhZGVyIGNvcHkgPSBuZXcgSGVhZGVyKG9yaWdpbmFsKTsKKworICAgICAgICAvLyBjb3B5IG11c3QgaGF2ZSBzYW1lIGZpZWxkcyBhcyBvcmlnaW5hbAorICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChmMSwgZjIsIGYzKSwgY29weS5nZXRGaWVsZHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KGYxLCBmMyksIGNvcHkuZ2V0RmllbGRzKCJuYW1lMSIpKTsKKworICAgICAgICAvLyBtb2RpZnkgb3JpZ2luYWwKKyAgICAgICAgb3JpZ2luYWwucmVtb3ZlRmllbGRzKCJuYW1lMSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChmMiksIG9yaWdpbmFsLmdldEZpZWxkcygpKTsKKworICAgICAgICAvLyBjb3B5IG1heSBub3QgYmUgYWZmZWN0ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoZjEsIGYyLCBmMyksIGNvcHkuZ2V0RmllbGRzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChmMSwgZjMpLCBjb3B5LmdldEZpZWxkcygibmFtZTEiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvRW50aXR5VGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0VudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQxNjdlCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL0VudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuQWJzdHJhY3RGaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlLkVudGl0eTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIEVudGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Qm9keSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBFbnRpdHkgZW50aXR5ID0gbmV3IEJvZHlQYXJ0KCk7CisgICAgICAgIGFzc2VydE51bGwoZW50aXR5LmdldEJvZHkoKSk7CisKKyAgICAgICAgQm9keSBib2R5ID0gbmV3IEJvZHlGYWN0b3J5KCkudGV4dEJvZHkoInRlc3QiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChib2R5LmdldFBhcmVudCgpKTsKKworICAgICAgICBlbnRpdHkuc2V0Qm9keShib2R5KTsKKyAgICAgICAgYXNzZXJ0U2FtZShib2R5LCBlbnRpdHkuZ2V0Qm9keSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShlbnRpdHksIGJvZHkuZ2V0UGFyZW50KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRCb2R5VHdpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBCb2R5UGFydCgpOworCisgICAgICAgIEJvZHkgYjEgPSBuZXcgQm9keUZhY3RvcnkoKS50ZXh0Qm9keSgiZm9vIik7CisgICAgICAgIEJvZHkgYjIgPSBuZXcgQm9keUZhY3RvcnkoKS50ZXh0Qm9keSgiYmFyIik7CisKKyAgICAgICAgZW50aXR5LnNldEJvZHkoYjEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW50aXR5LnNldEJvZHkoYjIpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgQm9keVBhcnQoKTsKKyAgICAgICAgQm9keSBib2R5ID0gbmV3IEJvZHlGYWN0b3J5KCkudGV4dEJvZHkoInRlc3QiKTsKKyAgICAgICAgZW50aXR5LnNldEJvZHkoYm9keSk7CisKKyAgICAgICAgQm9keSByZW1vdmVkID0gZW50aXR5LnJlbW92ZUJvZHkoKTsKKyAgICAgICAgYXNzZXJ0U2FtZShib2R5LCByZW1vdmVkKTsKKworICAgICAgICBhc3NlcnROdWxsKGVudGl0eS5nZXRCb2R5KCkpOworICAgICAgICBhc3NlcnROdWxsKHJlbW92ZWQuZ2V0UGFyZW50KCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREaXNwb3NpdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBCb2R5UGFydCgpOworCisgICAgICAgIGFzc2VydE51bGwoZW50aXR5LmdldERpc3Bvc2l0aW9uVHlwZSgpKTsKKworICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICBoZWFkZXIuc2V0RmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lIikpOworICAgICAgICBlbnRpdHkuc2V0SGVhZGVyKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmxpbmUiLCBlbnRpdHkuZ2V0RGlzcG9zaXRpb25UeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDb250ZW50RGlzcG9zaXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgQm9keVBhcnQoKTsKKworICAgICAgICBlbnRpdHkuc2V0Q29udGVudERpc3Bvc2l0aW9uKCJhdHRhY2htZW50Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRhY2htZW50IiwgZW50aXR5LmdldEhlYWRlcigpLmdldEZpZWxkKAorICAgICAgICAgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uIikuZ2V0Qm9keSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udGVudERpc3Bvc2l0aW9uVHlwZUZpbGVuYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgQm9keVBhcnQoKTsKKworICAgICAgICBlbnRpdHkuc2V0Q29udGVudERpc3Bvc2l0aW9uKCJhdHRhY2htZW50IiwgInNvbWUgZmlsZS5kYXQiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwic29tZSBmaWxlLmRhdFwiIiwgZW50aXR5CisgICAgICAgICAgICAgICAgLmdldEhlYWRlcigpLmdldEZpZWxkKCJDb250ZW50LURpc3Bvc2l0aW9uIikuZ2V0Qm9keSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZW5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRW50aXR5IGVudGl0eSA9IG5ldyBCb2R5UGFydCgpOworCisgICAgICAgIGFzc2VydE51bGwoZW50aXR5LmdldEZpbGVuYW1lKCkpOworCisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgIGhlYWRlci5zZXRGaWVsZChBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyAiCisgICAgICAgICAgICAgICAgKyAiZmlsZW5hbWU9XCJzb21lIGZpbGUuZGF0XCIiKSk7CisgICAgICAgIGVudGl0eS5zZXRIZWFkZXIoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInNvbWUgZmlsZS5kYXQiLCBlbnRpdHkuZ2V0RmlsZW5hbWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEZpbGVuYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEVudGl0eSBlbnRpdHkgPSBuZXcgQm9keVBhcnQoKTsKKworICAgICAgICBlbnRpdHkuc2V0RmlsZW5hbWUoImZpbGUgbmFtZS5leHQiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiZmlsZSBuYW1lLmV4dFwiIiwgZW50aXR5CisgICAgICAgICAgICAgICAgLmdldEhlYWRlcigpLmdldEZpZWxkKCJDb250ZW50LURpc3Bvc2l0aW9uIikuZ2V0Qm9keSgpKTsKKworICAgICAgICBlbnRpdHkuc2V0RmlsZW5hbWUobnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhdHRhY2htZW50IiwgZW50aXR5LmdldEhlYWRlcigpLmdldEZpZWxkKAorICAgICAgICAgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uIikuZ2V0Qm9keSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9FeGFtcGxlTWVzc2FnZXNSb3VuZHRyaXBUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvRXhhbXBsZU1lc3NhZ2VzUm91bmR0cmlwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYjRmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvRXhhbXBsZU1lc3NhZ2VzUm91bmR0cmlwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5jb2RlYy5Db2RlY1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLk1pbWVFbnRpdHlDb25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOworCisvKioKKyAqIENyZWF0ZXMgYSBUZXN0U3VpdGUgcnVubmluZyB0aGUgdGVzdCBmb3IgZWFjaCAubXNnIGZpbGUgaW4gdGhlIHRlc3QgcmVzb3VjZSBmb2xkZXIuCisgKiBBbGxvdyBydW5uaW5nIG9mIGEgc2luZ2xlIHRlc3QgZnJvbSBVbml0IHRlc3RpbmcgR1VJcworICovCitwdWJsaWMgY2xhc3MgRXhhbXBsZU1lc3NhZ2VzUm91bmR0cmlwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgRmlsZSBmaWxlOworCisKKyAgICBwdWJsaWMgRXhhbXBsZU1lc3NhZ2VzUm91bmR0cmlwVGVzdChTdHJpbmcgdGVzdE5hbWUpIHsKKyAgICAgICAgdGhpcyh0ZXN0TmFtZSwgRXhhbXBsZU1lc3NhZ2VzUm91bnRyaXBUZXN0U3VpdGUuZ2V0RmlsZSh0ZXN0TmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBFeGFtcGxlTWVzc2FnZXNSb3VuZHRyaXBUZXN0KFN0cmluZyBuYW1lLCBGaWxlIHRlc3RGaWxlKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICB0aGlzLmZpbGUgPSB0ZXN0RmlsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgQmFzaWNDb25maWd1cmF0b3IucmVzZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOworICAgIH0KKyAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgTWltZUVudGl0eUNvbmZpZyBjb25maWcgPSBuZXcgTWltZUVudGl0eUNvbmZpZygpOworICAgICAgICBjb25maWcuc2V0TWF4TGluZUxlbigtMSk7CisgICAgICAgIE1lc3NhZ2UgaW5wdXRNZXNzYWdlID0gbmV3IE1lc3NhZ2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSwgY29uZmlnKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgaW5wdXRNZXNzYWdlLndyaXRlVG8ob3V0KTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBtc2dvdXRGaWxlID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoMCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sYXN0SW5kZXhPZignLicpKSArICIub3V0IjsKKyAgICAgICAgU3RyaW5nIG1zZ291dEZpbGVNaW1lNGogPSBmaWxlLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZygwLCBmaWxlLmdldEFic29sdXRlUGF0aCgpLmxhc3RJbmRleE9mKCcuJykpICsgIi5taW1lNGoub3V0IjsKKyAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWRzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBDb2RlY1V0aWwuY29weShuZXcgRmlsZUlucHV0U3RyZWFtKG1zZ291dEZpbGUpLCBleHBlY3RlZHN0cmVhbSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIEV4cGVjdGVkIHJlc3VsdCIsIG5ldyBTdHJpbmcoZXhwZWN0ZWRzdHJlYW0udG9CeXRlQXJyYXkoKSksIG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obXNnb3V0RmlsZU1pbWU0aik7CisgICAgICAgICAgICBmb3Mud3JpdGUob3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgZm9zLmZsdXNoKCk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGZpbGUgbm90IGZvdW5kOiBnZW5lcmF0ZWQgYSBmaWxlIHdpdGggdGhlIGV4cGVjdGVkIHJlc3VsdCEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXhhbXBsZU1lc3NhZ2VzUm91bnRyaXBUZXN0U3VpdGUoKTsKKyAgICB9CisKKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgRXhhbXBsZU1lc3NhZ2VzUm91bnRyaXBUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgVEVTVFNfRk9MREVSID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncyIpOworCisgICAgICAgIHB1YmxpYyBFeGFtcGxlTWVzc2FnZXNSb3VudHJpcFRlc3RTdWl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgRmlsZSBkaXIgPSBURVNUU19GT0xERVI7CisgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoRmlsZSBmIDogZmlsZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLm1zZyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFRlc3QobmV3IEV4YW1wbGVNZXNzYWdlc1JvdW5kdHJpcFRlc3QoZi5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIGYuZ2V0TmFtZSgpLmxlbmd0aCgpLTQpLCBmKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0RmlsZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKFRFU1RTX0ZPTERFUi5nZXRBYnNvbHV0ZVBhdGgoKStGaWxlLnNlcGFyYXRvcituYW1lKyIubXNnIik7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9IZWFkZXJUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvSGVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDI3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvSGVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOw0KKw0KK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQuQnl0ZUFycmF5T3V0cHV0U3RyZWFtOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5BYnN0cmFjdEZpZWxkOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRmllbGQ7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7DQorDQorcHVibGljIGNsYXNzIEhlYWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQkpFQ1QgPSAiU3ViamVjdDogdGVzdCI7DQorDQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPID0gIlRvOiBhbnl1c2VyIDxhbnlAdXNlcj4iOw0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOw0KKyAgICAgICAgaGVhZGVyLmFkZEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoU1VCSkVDVCkpOw0KKyAgICAgICAgaGVhZGVyLmFkZEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoVE8pKTsNCisNCisgICAgICAgIGFzc2VydE5vdE51bGwoIlN1YmplY3QgZm91bmQiLCBoZWFkZXIuZ2V0RmllbGQoIlN1YmplY3QiKSk7DQorICAgICAgICBhc3NlcnROb3ROdWxsKCJUbyBmb3VuZCIsIGhlYWRlci5nZXRGaWVsZCgiVG8iKSk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoIkhlYWRlcnMgZXF1YWxzIiwgU1VCSkVDVCArICJcclxuIiArIFRPICsgIlxyXG4iLCBoZWFkZXINCisgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1dJU1NfR0VSTUFOX0hFTExPID0gIkdyXDM3NGV6aV96XDM0NG1cMzQ0IjsNCisNCisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlU3BlY2lhbENoYXJhY3RlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBoZWxsbyA9IFNXSVNTX0dFUk1BTl9IRUxMTzsNCisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7DQorICAgICAgICBoZWFkZXIuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiSGVsbG86ICIgKyBoZWxsbykpOw0KKyAgICAgICAgDQorICAgICAgICBGaWVsZCBmaWVsZCA9IGhlYWRlci5nZXRGaWVsZCgiSGVsbG8iKTsNCisgICAgICAgIGFzc2VydE5vdE51bGwoZmllbGQpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGhlbGxvLCBmaWVsZC5nZXRCb2R5KCkpOw0KKyAgICAgICAgDQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOw0KKyAgICAgICAgDQorICAgICAgICBNZXNzYWdlV3JpdGVyLkRFRkFVTFQud3JpdGVIZWFkZXIoaGVhZGVyLCBidWZmZXIpOw0KKyAgICAgICAgU3RyaW5nIHMgPSBidWZmZXIudG9TdHJpbmcoQ2hhcnNldFV0aWwuVVNfQVNDSUkubmFtZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbzogR3I/ZXppX3o/bT9cclxuXHJcbiIsIHMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7DQorICAgICAgICBoZWFkZXIuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiUmVjZWl2ZWQ6IGZyb20gZm9vIGJ5IGJhciBmb3IgamFtZXMiKSk7DQorICAgICAgICBoZWFkZXIuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJIikpOw0KKyAgICAgICAgaGVhZGVyLmFkZEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIlJlQ2VJdkVkOiBmcm9tIGJhciBieSBmb28gZm9yIGphbWVzIikpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGhlYWRlci5nZXRGaWVsZHMoKS5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGhlYWRlci5nZXRGaWVsZHMoInJlY2VpdmVkIikuc2l6ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0RmllbGRzKCJDb250ZW50LVR5cGUiKS5zaXplKCkpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGhlYWRlci5yZW1vdmVGaWVsZHMoInJFY0VpVmVEIikpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhlYWRlci5nZXRGaWVsZHMoKS5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGhlYWRlci5nZXRGaWVsZHMoInJlY2VpdmVkIikuc2l6ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0RmllbGRzKCJDb250ZW50LVR5cGUiKS5zaXplKCkpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb250ZW50LXR5cGUiLCBoZWFkZXIuZ2V0RmllbGRzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vbkV4aXN0YW50RmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7DQorICAgICAgICBoZWFkZXIuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiUmVjZWl2ZWQ6IGZyb20gZm9vIGJ5IGJhciBmb3IgamFtZXMiKSk7DQorICAgICAgICBoZWFkZXIuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJIikpOw0KKyAgICAgICAgaGVhZGVyLmFkZEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIlJlQ2VJdkVkOiBmcm9tIGJhciBieSBmb28gZm9yIGphbWVzIikpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGhlYWRlci5yZW1vdmVGaWVsZHMoIm5vU3VjaEZpZWxkIikpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGhlYWRlci5nZXRGaWVsZHMoKS5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGhlYWRlci5nZXRGaWVsZHMoInJlY2VpdmVkIikuc2l6ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0RmllbGRzKCJDb250ZW50LVR5cGUiKS5zaXplKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsNCisgICAgICAgIGhlYWRlci5hZGRGaWVsZChBYnN0cmFjdEZpZWxkLnBhcnNlKCJGcm9tOiBtaW1lNGpAamFtZXMuYXBhY2hlLm9yZyIpKTsNCisgICAgICAgIGhlYWRlci5hZGRGaWVsZChBYnN0cmFjdEZpZWxkLnBhcnNlKCJSZWNlaXZlZDogZnJvbSBmb28gYnkgYmFyIGZvciBqYW1lcyIpKTsNCisgICAgICAgIGhlYWRlci5hZGRGaWVsZChBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUkiKSk7DQorICAgICAgICBoZWFkZXIuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiUmVDZUl2RWQ6IGZyb20gYmFyIGJ5IGZvbyBmb3IgamFtZXMiKSk7DQorDQorICAgICAgICBoZWFkZXIuc2V0RmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgicmVjZWl2ZWQ6IGZyb20gbm9ib2R5IGJ5IG5vb25lIGZvciBqYW1lcyIpKTsNCisNCisgICAgICAgIGFzc2VydEVxdWFscygzLCBoZWFkZXIuZ2V0RmllbGRzKCkuc2l6ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0RmllbGRzKCJyZWNlaXZlZCIpLnNpemUoKSk7DQorDQorICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb20iLCBoZWFkZXIuZ2V0RmllbGRzKCkuZ2V0KDApLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInJlY2VpdmVkIiwgaGVhZGVyLmdldEZpZWxkcygpLmdldCgxKS5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb250ZW50LXR5cGUiLCBoZWFkZXIuZ2V0RmllbGRzKCkuZ2V0KDIpLmdldE5hbWUoKSk7DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdFNldE5vbkV4aXN0YW50RmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7DQorICAgICAgICBoZWFkZXIuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiUmVjZWl2ZWQ6IGZyb20gZm9vIGJ5IGJhciBmb3IgamFtZXMiKSk7DQorICAgICAgICBoZWFkZXIuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJIikpOw0KKyAgICAgICAgaGVhZGVyLmFkZEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIlJlQ2VJdkVkOiBmcm9tIGJhciBieSBmb28gZm9yIGphbWVzIikpOw0KKw0KKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIk1lc3NhZ2UtSUQ6IDxtc2c5OTAxQGFwYWNoZS5vcmc+IikpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGhlYWRlci5nZXRGaWVsZHMoKS5zaXplKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhlYWRlci5nZXRGaWVsZHMoIm1lc3NhZ2UtaWQiKS5zaXplKCkpOw0KKw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlLUlEIiwgaGVhZGVyLmdldEZpZWxkcygpLmdldCgzKS5nZXROYW1lKCkpOw0KKyAgICB9DQorICAgIA0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZUNvbXBsZXRlTWFpbFRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9NZXNzYWdlQ29tcGxldGVNYWlsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMWVlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZUNvbXBsZXRlTWFpbFRlc3QuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouRXhhbXBsZU1haWw7CisKK3B1YmxpYyBjbGFzcyBNZXNzYWdlQ29tcGxldGVNYWlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGFydEFsdGVybmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2UoRXhhbXBsZU1haWwuTUlNRV9NVUxUSVBBUlRfQUxURVJOQVRJVkVfQllURVMpOworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgYmUgYSBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUgbWFpbCIsIG1lc3NhZ2UuaXNNdWx0aXBhcnQoKSk7CisgICAgICAgIE11bHRpcGFydCBwYXJ0ID0gKE11bHRpcGFydCltZXNzYWdlLmdldEJvZHkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbHRlcm5hdGl2ZSIsIHBhcnQuZ2V0U3ViVHlwZSgpKTsKKyAgICB9ICAgIAorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBhcnRNaXhlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlKEV4YW1wbGVNYWlsLk1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX0JZVEVTKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIGJlIGEgbXVsdGlwYXJ0L21peGVkIG1haWwiLCBtZXNzYWdlLmlzTXVsdGlwYXJ0KCkpOworICAgICAgICBNdWx0aXBhcnQgcGFydCA9IChNdWx0aXBhcnQpbWVzc2FnZS5nZXRCb2R5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygibWl4ZWQiLCBwYXJ0LmdldFN1YlR5cGUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoYnl0ZVtdIG9jdGV0cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9jdGV0cyk7CisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKGluKTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VQYXJzZXJUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZVBhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGZmMDUwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoubWVzc2FnZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5GaWVsZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZUVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNvbnRlbnRVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKKworcHVibGljIGNsYXNzIE1lc3NhZ2VQYXJzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworICAgIHByaXZhdGUgRmlsZSBmaWxlID0gbnVsbDsKKworICAgIHB1YmxpYyBNZXNzYWdlUGFyc2VyVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzKG5hbWUsIE1lc3NhZ2VQYXJzZXJUZXN0U3VpdGUuZ2V0RmlsZShuYW1lKSk7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VQYXJzZXJUZXN0KFN0cmluZyBuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLnJlc2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKKyAgICB9CisgICAgICAgIAorICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlUGFyc2VyVGVzdFN1aXRlKCk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBjbGFzcyBNZXNzYWdlUGFyc2VyVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgVEVTVFNfRk9MREVSID0gbmV3IEZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncyIpOworCisgICAgICAgIHB1YmxpYyBNZXNzYWdlUGFyc2VyVGVzdFN1aXRlKCkgeworICAgICAgICAgICAgRmlsZSBkaXIgPSBURVNUU19GT0xERVI7CisgICAgICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGkgPCA1MDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBmaWxlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLm1zZyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFRlc3QobmV3IE1lc3NhZ2VQYXJzZXJUZXN0KGYuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCBmLmdldE5hbWUoKS5sZW5ndGgoKS00KSwgZikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlIGdldEZpbGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShURVNUU19GT0xERVIuZ2V0QWJzb2x1dGVQYXRoKCkrRmlsZS5zZXBhcmF0b3IrbmFtZSsiLm1zZyIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBmaWxlOworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJzaW5nICIgKyBmLmdldE5hbWUoKSk7CisgICAgICAgIAorICAgICAgICBNaW1lRW50aXR5Q29uZmlnIGNvbmZpZyA9IG5ldyBNaW1lRW50aXR5Q29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5zZXRNYXhMaW5lTGVuKC0xKTsKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UobmV3IEZpbGVJbnB1dFN0cmVhbShmKSwgY29uZmlnKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBwcmVmaXggPSBmLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgZi5nZXROYW1lKCkubGVuZ3RoKCkgLSA0KTsKKyAgICAgICAgU3RyaW5nIHhtbEZpbGVOYW1lID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGZpbGVOYW1lLmxlbmd0aCgpIC0gNCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJfZGVjb2RlZC54bWwiOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGdldFN0cnVjdHVyZShtLCBwcmVmaXgsICIxIik7CisgICAgICAgIFN0cmluZyBtaW1lNGpGaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtIDQpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiX2RlY29kZWQubWltZTRqLnhtbCI7CisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleHBlY3RlZCA9IElPVXRpbHMudG9TdHJpbmcobmV3IEZpbGVJbnB1dFN0cmVhbSh4bWxGaWxlTmFtZSksICJJU084ODU5LTEiKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB3cml0ZVRvRmlsZShyZXN1bHQsIG1pbWU0akZpbGVOYW1lKTsKKyAgICAgICAgICAgIGZhaWwoIlRlc3QgZmlsZSBub3QgZm91bmQuIEdlbmVyYXRlZCB0aGUgZXhwZWN0ZWQgcmVzdWx0IHdpdGggbWltZTRqIHByZWZpeDogIitleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCk7CisgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGFlKSB7CisgICAgICAgICAgICB3cml0ZVRvRmlsZShyZXN1bHQsIG1pbWU0akZpbGVOYW1lKTsKKyAgICAgICAgICAgIHRocm93IGFlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVG9GaWxlKFN0cmluZyByZXN1bHQsIFN0cmluZyBtaW1lNGpGaWxlTmFtZSkKKyAgICAgICAgICAgIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obWltZTRqRmlsZU5hbWUpOworICAgICAgICBvdXQud3JpdGUocmVzdWx0LmdldEJ5dGVzKCJJU084ODU5LTEiKSk7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBlc2NhcGUoU3RyaW5nIHMpIHsKKyAgICAgICAgcyA9IHMucmVwbGFjZUFsbCgiJiIsICImYW1wOyIpOworICAgICAgICBzID0gcy5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKTsKKyAgICAgICAgcmV0dXJuIHMucmVwbGFjZUFsbCgiPiIsICImZ3Q7Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RydWN0dXJlKEVudGl0eSBlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgaWQpIAorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAKKyAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNZXNzYWdlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjxtZXNzYWdlPlxyXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPGJvZHktcGFydD5cclxuIik7CisgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHNiLmFwcGVuZCgiPGhlYWRlcj5cclxuIik7CisgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBlLmdldEhlYWRlcigpLmdldEZpZWxkcygpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjxmaWVsZD5cclxuIgorICAgICAgICAgICAgICAgICAgICArIGVzY2FwZShDb250ZW50VXRpbC5kZWNvZGUoZmllbGQuZ2V0UmF3KCkpKQorICAgICAgICAgICAgICAgICAgICArICI8L2ZpZWxkPlxyXG4iKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoIjwvaGVhZGVyPlxyXG4iKTsKKyAgICAgICAgCisgICAgICAgIGlmIChlLmdldEJvZHkoKSBpbnN0YW5jZW9mIE11bHRpcGFydCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCI8bXVsdGlwYXJ0PlxyXG4iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTXVsdGlwYXJ0IG11bHRpcGFydCA9KE11bHRpcGFydCkgZS5nZXRCb2R5KCk7IAorICAgICAgICAgICAgTGlzdDxCb2R5UGFydD4gcGFydHMgPSBtdWx0aXBhcnQuZ2V0Qm9keVBhcnRzKCk7CisKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPHByZWFtYmxlPlxyXG4iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChlc2NhcGUobXVsdGlwYXJ0LmdldFByZWFtYmxlKCkpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPC9wcmVhbWJsZT5cclxuIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgICAgIGZvciAoQm9keVBhcnQgYm9keVBhcnQgOiBwYXJ0cykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChnZXRTdHJ1Y3R1cmUoYm9keVBhcnQsIHByZWZpeCwgaWQgKyAiXyIgKyAoaSsrKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYi5hcHBlbmQoIjxlcGlsb2d1ZT5cclxuIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlKG11bHRpcGFydC5nZXRFcGlsb2d1ZSgpKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvZXBpbG9ndWU+XHJcbiIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvbXVsdGlwYXJ0PlxyXG4iKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgaWYgKGUuZ2V0Qm9keSgpIGluc3RhbmNlb2YgTWVzc2FnZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGdldFN0cnVjdHVyZSgoTWVzc2FnZSkgZS5nZXRCb2R5KCksIHByZWZpeCwgaWQgKyAiXzEiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBCb2R5IGIgPSBlLmdldEJvZHkoKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcHJlZml4ICsgIl9kZWNvZGVkXyIgKyBpZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChiIGluc3RhbmNlb2YgVGV4dEJvZHkgPyAiLnR4dCIgOiAiLmJpbiIpOworICAgICAgICAgICAgU3RyaW5nIHRhZyA9IGIgaW5zdGFuY2VvZiBUZXh0Qm9keSA/ICJ0ZXh0LWJvZHkiIDogImJpbmFyeS1ib2R5IjsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiPCIgKyB0YWcgKyAiIG5hbWU9XCIiICsgbmFtZSArICJcIi8+XHJcbiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgRmlsZSBleHBlY3RlZEZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudCgpLCBuYW1lKTsKKyAgICAgICAgICAgIEZpbGUgbWltZTRqRmlsZSA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50KCksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDQpICsgIi5taW1lNGoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoYiBpbnN0YW5jZW9mIFRleHRCb2R5ID8gIi50eHQiIDogIi5iaW4iKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBleHBlY3RlZCA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShleHBlY3RlZEZpbGUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHdyaXRlVG9GaWxlKGIsIG1pbWU0akZpbGUpOworICAgICAgICAgICAgICAgIGZhaWwoIlRlc3QgZmlsZSBub3QgZm91bmQuIEdlbmVyYXRlZCB0aGUgZXhwZWN0ZWQgcmVzdWx0IHdpdGggbWltZTRqIHByZWZpeDogIitleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChiIGluc3RhbmNlb2YgVGV4dEJvZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNoYXJzZXQgPSBDaGFyc2V0VXRpbC50b0phdmFDaGFyc2V0KGUuZ2V0Q2hhcnNldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9ICJJU084ODU5LTEiOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHMxID0gSU9VdGlscy50b1N0cmluZyhleHBlY3RlZCwgY2hhcnNldCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzMiA9IElPVXRpbHMudG9TdHJpbmcoKChUZXh0Qm9keSkgYikuZ2V0UmVhZGVyKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGaWxlLmdldE5hbWUoKSwgczEsIHMyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHNCaW5hcnkoZXhwZWN0ZWRGaWxlLmdldE5hbWUoKSwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChCaW5hcnlCb2R5KSBiKS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlcikgeworICAgICAgICAgICAgICAgIHdyaXRlVG9GaWxlKGIsIG1pbWU0akZpbGUpOworICAgICAgICAgICAgICAgIHRocm93IGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBNZXNzYWdlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvbWVzc2FnZT5cclxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjwvYm9keS1wYXJ0PlxyXG4iKTsKKyAgICAgICAgfSAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVG9GaWxlKEJvZHkgYiwgRmlsZSBtaW1lNGpGaWxlKQorICAgICAgICAgICAgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYiBpbnN0YW5jZW9mIFRleHRCb2R5KSB7CisgICAgICAgICAgICBTdHJpbmcgY2hhcnNldCA9IENoYXJzZXRVdGlsLnRvSmF2YUNoYXJzZXQoYi5nZXRQYXJlbnQoKS5nZXRDaGFyc2V0KCkpOworICAgICAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAiSVNPODg1OS0xIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1pbWU0akZpbGUpOworICAgICAgICAgICAgSU9VdGlscy5jb3B5KCgoVGV4dEJvZHkpIGIpLmdldFJlYWRlcigpLCBvdXQsIGNoYXJzZXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1pbWU0akZpbGUpOworICAgICAgICAgICAgSU9VdGlscy5jb3B5KCgoQmluYXJ5Qm9keSkgYikuZ2V0SW5wdXRTdHJlYW0oKSwgb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNCaW5hcnkoU3RyaW5nIG1zZywgSW5wdXRTdHJlYW0gYSwgSW5wdXRTdHJlYW0gYikgCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgaW50IHBvcyA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgYjEgPSBhLnJlYWQoKTsKKyAgICAgICAgICAgIGludCBiMiA9IGIucmVhZCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZyArICIgKFBvc2l0aW9uICIgKyAoKytwb3MpICsgIikiLCBiMSwgYjIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYjEgPT0gLTEgfHwgYjIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9NZXNzYWdlVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjYmYyZQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9NZXNzYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTA0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZVpvbmU7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5maWVsZC5BYnN0cmFjdEZpZWxkOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLmFkZHJlc3MuR3JvdXA7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZmllbGQuYWRkcmVzcy5NYWlsYm94OworCitwdWJsaWMgY2xhc3MgTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgcHJpdmF0ZSBIZWFkZXIgaGVhZGVyVGV4dFBsYWluID0gbnVsbDsKKyAgICBwcml2YXRlIEhlYWRlciBoZWFkZXJNZXNzYWdlUkZDODIyID0gbnVsbDsKKyAgICBwcml2YXRlIEhlYWRlciBoZWFkZXJFbXB0eSA9IG51bGw7CisgICAgcHJpdmF0ZSBIZWFkZXIgaGVhZGVyTXVsdGlwYXJ0TWl4ZWQgPSBudWxsOworICAgIHByaXZhdGUgSGVhZGVyIGhlYWRlck11bHRpcGFydERpZ2VzdCA9IG51bGw7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBoZWFkZXJUZXh0UGxhaW4gPSBuZXcgSGVhZGVyKCk7CisgICAgICAgIGhlYWRlck1lc3NhZ2VSRkM4MjIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgIGhlYWRlckVtcHR5ID0gbmV3IEhlYWRlcigpOworICAgICAgICBoZWFkZXJNdWx0aXBhcnRNaXhlZCA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyTXVsdGlwYXJ0RGlnZXN0ID0gbmV3IEhlYWRlcigpOworICAgICAgICAKKyAgICAgICAgaGVhZGVyVGV4dFBsYWluLmFkZEZpZWxkKAorICAgICAgICAgICAgICAgIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpKTsKKyAgICAgICAgaGVhZGVyTWVzc2FnZVJGQzgyMi5hZGRGaWVsZCgKKyAgICAgICAgICAgICAgICBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVR5cGU6IG1lc3NhZ2UvUkZDODIyIikpOworICAgICAgICBoZWFkZXJNdWx0aXBhcnRNaXhlZC5hZGRGaWVsZCgKKyAgICAgICAgICAgICAgICBBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Zm9vIikpOworICAgICAgICBoZWFkZXJNdWx0aXBhcnREaWdlc3QuYWRkRmllbGQoCisgICAgICAgICAgICAgICAgQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT1mb28iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldE1pbWVUeXBlKCkgeworICAgICAgICBNZXNzYWdlIHBhcmVudCA9IG51bGw7CisgICAgICAgIE1lc3NhZ2UgY2hpbGQgPSBudWxsOworICAgICAgICAKKyAgICAgICAgcGFyZW50ID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgY2hpbGQgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICBjaGlsZC5zZXRQYXJlbnQocGFyZW50KTsKKyAgICAgICAgcGFyZW50LnNldEhlYWRlcihoZWFkZXJNdWx0aXBhcnREaWdlc3QpOworICAgICAgICBjaGlsZC5zZXRIZWFkZXIoaGVhZGVyRW1wdHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm11bHRpcGFydC9kaWdlc3QsIGVtcHR5IiwgIm1lc3NhZ2UvcmZjODIyIiwgCisgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWltZVR5cGUoKSk7CisgICAgICAgIGNoaWxkLnNldEhlYWRlcihoZWFkZXJUZXh0UGxhaW4pOworICAgICAgICBhc3NlcnRFcXVhbHMoIm11bHRpcGFydC9kaWdlc3QsIHRleHQvcGxhaW4iLCAidGV4dC9wbGFpbiIsIAorICAgICAgICAgICAgICAgIGNoaWxkLmdldE1pbWVUeXBlKCkpOworICAgICAgICBjaGlsZC5zZXRIZWFkZXIoaGVhZGVyTWVzc2FnZVJGQzgyMik7CisgICAgICAgIGFzc2VydEVxdWFscygibXVsdGlwYXJ0L2RpZ2VzdCwgbWVzc2FnZS9yZmM4MjIiLCAibWVzc2FnZS9yZmM4MjIiLCAKKyAgICAgICAgICAgICAgICBjaGlsZC5nZXRNaW1lVHlwZSgpKTsKKyAgICAgICAgCisgICAgICAgIHBhcmVudCA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIGNoaWxkID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgY2hpbGQuc2V0UGFyZW50KHBhcmVudCk7CisgICAgICAgIHBhcmVudC5zZXRIZWFkZXIoaGVhZGVyTXVsdGlwYXJ0TWl4ZWQpOworICAgICAgICBjaGlsZC5zZXRIZWFkZXIoaGVhZGVyRW1wdHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm11bHRpcGFydC9taXhlZCwgZW1wdHkiLCAidGV4dC9wbGFpbiIsIAorICAgICAgICAgICAgICAgIGNoaWxkLmdldE1pbWVUeXBlKCkpOworICAgICAgICBjaGlsZC5zZXRIZWFkZXIoaGVhZGVyVGV4dFBsYWluKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtdWx0aXBhcnQvbWl4ZWQsIHRleHQvcGxhaW4iLCAidGV4dC9wbGFpbiIsIAorICAgICAgICAgICAgICAgIGNoaWxkLmdldE1pbWVUeXBlKCkpOworICAgICAgICBjaGlsZC5zZXRIZWFkZXIoaGVhZGVyTWVzc2FnZVJGQzgyMik7CisgICAgICAgIGFzc2VydEVxdWFscygibXVsdGlwYXJ0L21peGVkLCBtZXNzYWdlL3JmYzgyMiIsICJtZXNzYWdlL3JmYzgyMiIsIAorICAgICAgICAgICAgICAgIGNoaWxkLmdldE1pbWVUeXBlKCkpOworICAgICAgICAKKyAgICAgICAgY2hpbGQgPSBuZXcgTWVzc2FnZSgpOworICAgICAgICBjaGlsZC5zZXRIZWFkZXIoaGVhZGVyRW1wdHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm51bGwsIGVtcHR5IiwgInRleHQvcGxhaW4iLCBjaGlsZC5nZXRNaW1lVHlwZSgpKTsKKyAgICAgICAgY2hpbGQuc2V0SGVhZGVyKGhlYWRlclRleHRQbGFpbik7CisgICAgICAgIGFzc2VydEVxdWFscygibnVsbCwgdGV4dC9wbGFpbiIsICJ0ZXh0L3BsYWluIiwgY2hpbGQuZ2V0TWltZVR5cGUoKSk7CisgICAgICAgIGNoaWxkLnNldEhlYWRlcihoZWFkZXJNZXNzYWdlUkZDODIyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsLCBtZXNzYWdlL3JmYzgyMiIsICJtZXNzYWdlL3JmYzgyMiIsIAorICAgICAgICAgICAgICAgIGNoaWxkLmdldE1pbWVUeXBlKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RJc011bHRpcGFydCgpIHsKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgCisgICAgICAgIG0uc2V0SGVhZGVyKGhlYWRlckVtcHR5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZW1wdHkiLCAhbS5pc011bHRpcGFydCgpKTsKKyAgICAgICAgCisgICAgICAgIG0uc2V0SGVhZGVyKGhlYWRlclRleHRQbGFpbik7CisgICAgICAgIGFzc2VydFRydWUoInRleHQvcGxhaW4iLCAhbS5pc011bHRpcGFydCgpKTsKKyAgICAgICAgCisgICAgICAgIG0uc2V0SGVhZGVyKGhlYWRlck11bHRpcGFydERpZ2VzdCk7CisgICAgICAgIGFzc2VydFRydWUoIm11bHRpcGFydC9kaWdlc3QiLCBtLmlzTXVsdGlwYXJ0KCkpOworICAgICAgICAKKyAgICAgICAgbS5zZXRIZWFkZXIoaGVhZGVyTXVsdGlwYXJ0TWl4ZWQpOworICAgICAgICBhc3NlcnRUcnVlKCJtdWx0aXBhcnQvbWl4ZWQiLCBtLmlzTXVsdGlwYXJ0KCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gaW5wdXRCeXRlID0gZ2V0UmF3TWVzc2FnZUFzQnl0ZUFycmF5KCk7CisKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0Qnl0ZSkpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIG0ud3JpdGVUbyhvdXQpOworCisgICAgICAgIElucHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgICAgaW50IGIgPSAtMTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoKGIgPSBvdXRwdXQucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzYW1lIGJ5dGUiLCBiLCBpbnB1dEJ5dGVbaV0pOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZEhlYWRlcldyaXRlVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSAidGVzdGhlYWRlciI7CisgICAgICAgIFN0cmluZyBoZWFkZXJWYWx1ZSA9ICJ0ZXN0dmFsdWUiOworICAgICAgICBTdHJpbmcgdGVzdGhlYWRlciA9IGhlYWRlck5hbWUgKyAiOiAiICsgaGVhZGVyVmFsdWU7CisKKyAgICAgICAgYnl0ZVtdIGlucHV0Qnl0ZSA9IGdldFJhd01lc3NhZ2VBc0J5dGVBcnJheSgpOworCisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dEJ5dGUpKTsKKyAgICAgICAgbS5nZXRIZWFkZXIoKS5hZGRGaWVsZChBYnN0cmFjdEZpZWxkLnBhcnNlKHRlc3RoZWFkZXIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImhlYWRlciBhZGRlZCIsIG0uZ2V0SGVhZGVyKCkuZ2V0RmllbGQoaGVhZGVyTmFtZSkKKyAgICAgICAgICAgICAgICAuZ2V0Qm9keSgpLCBoZWFkZXJWYWx1ZSk7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgbS53cml0ZVRvKG91dCk7CisgICAgICAgIExpc3Q8Pz4gbGluZXMgPSBJT1V0aWxzLnJlYWRMaW5lcygobmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0CisgICAgICAgICAgICAgICAgICAgICAgICAudG9CeXRlQXJyYXkoKSkpKSkpOworCisgICAgICAgIGFzc2VydFRydWUoImhlYWRlciBhZGRlZCIsIGxpbmVzLmNvbnRhaW5zKHRlc3RoZWFkZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWVzc2FnZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIGFzc2VydE51bGwobS5nZXRNZXNzYWdlSWQoKSk7CisKKyAgICAgICAgU3RyaW5nIGlkID0gIjxtc2cxN0Bsb2NhbGhvc3Q+IjsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIk1lc3NhZ2UtSUQ6ICIgKyBpZCkpOworICAgICAgICBtLnNldEhlYWRlcihoZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoaWQsIG0uZ2V0TWVzc2FnZUlkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNZXNzYWdlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgbS5jcmVhdGVNZXNzYWdlSWQoImhvc3RuYW1lIik7CisKKyAgICAgICAgU3RyaW5nIGlkID0gbS5nZXRNZXNzYWdlSWQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpZCk7CisgICAgICAgIGFzc2VydFRydWUoaWQuc3RhcnRzV2l0aCgiPE1pbWU0ai4iKSk7CisgICAgICAgIGFzc2VydFRydWUoaWQuZW5kc1dpdGgoIkBob3N0bmFtZT4iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1YmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtLmdldFN1YmplY3QoKSk7CisKKyAgICAgICAgU3RyaW5nIHN1YmplY3QgPSAidGVzdGluZyAxIDIiOworICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICBoZWFkZXIuc2V0RmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiU3ViamVjdDogIiArIHN1YmplY3QpKTsKKyAgICAgICAgbS5zZXRIZWFkZXIoaGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN1YmplY3QsIG0uZ2V0U3ViamVjdCgpKTsKKworICAgICAgICBoZWFkZXIuc2V0RmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiU3ViamVjdDogPT93aW5kb3dzLTEyNTI/UT85OV89ODA/PSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI5OSBcdTIwYWMiLCBtLmdldFN1YmplY3QoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFN1YmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKKworICAgICAgICBtLnNldFN1YmplY3QoIlNlbW1lbGJyXDM2NnNlbCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNlbW1lbGJyXDM2NnNlbCIsIG0uZ2V0U3ViamVjdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI9P0lTTy04ODU5LTE/UT9TZW1tZWxicj1GNnNlbD89IiwgbS5nZXRIZWFkZXIoKS5nZXRGaWVsZCgKKyAgICAgICAgICAgICAgICAiU3ViamVjdCIpLmdldEJvZHkoKSk7CisKKyAgICAgICAgbS5zZXRTdWJqZWN0KG51bGwpOworICAgICAgICBhc3NlcnROdWxsKG0uZ2V0SGVhZGVyKCkuZ2V0RmllbGQoIlN1YmplY3QiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldERhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtLmdldERhdGUoKSk7CisKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIkRhdGU6IFRodSwgMSBKYW4gMTk3MCAwNTozMDowMCArMDUzMCIpKTsKKyAgICAgICAgbS5zZXRIZWFkZXIoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERhdGUoMCksIG0uZ2V0RGF0ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIG0gPSBuZXcgTWVzc2FnZSgpOworCisgICAgICAgIG0uc2V0RGF0ZShuZXcgRGF0ZSg4NjQwMDAwMCksIFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRGF0ZSg4NjQwMDAwMCksIG0uZ2V0RGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGcmksIDIgSmFuIDE5NzAgMDA6MDA6MDAgKzAwMDAiLCBtLmdldEhlYWRlcigpLmdldEZpZWxkKAorICAgICAgICAgICAgICAgICJEYXRlIikuZ2V0Qm9keSgpKTsKKworICAgICAgICBtLnNldERhdGUobnVsbCk7CisgICAgICAgIGFzc2VydE51bGwobS5nZXRIZWFkZXIoKS5nZXRGaWVsZCgiRGF0ZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2VuZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIGFzc2VydE51bGwobS5nZXRTZW5kZXIoKSk7CisKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIlNlbmRlcjogam9obi5kb2VAZXhhbXBsZS5uZXQiKSk7CisgICAgICAgIG0uc2V0SGVhZGVyKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqb2huLmRvZUBleGFtcGxlLm5ldCIsIG0uZ2V0U2VuZGVyKCkuZ2V0QWRkcmVzcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U2VuZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisKKyAgICAgICAgbS5zZXRTZW5kZXIoTWFpbGJveC5wYXJzZSgiam9obi5kb2VAZXhhbXBsZS5uZXQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiam9obi5kb2VAZXhhbXBsZS5uZXQiLCBtLmdldEhlYWRlcigpLmdldEZpZWxkKCJTZW5kZXIiKQorICAgICAgICAgICAgICAgIC5nZXRCb2R5KCkpOworCisgICAgICAgIG0uc2V0U2VuZGVyKG51bGwpOworICAgICAgICBhc3NlcnROdWxsKG0uZ2V0SGVhZGVyKCkuZ2V0RmllbGQoIlNlbmRlciIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RnJvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIG0gPSBuZXcgTWVzc2FnZSgpOworICAgICAgICBhc3NlcnROdWxsKG0uZ2V0RnJvbSgpKTsKKworICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICBoZWFkZXIuc2V0RmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiRnJvbTogam9obi5kb2VAZXhhbXBsZS5uZXQiKSk7CisgICAgICAgIG0uc2V0SGVhZGVyKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqb2huLmRvZUBleGFtcGxlLm5ldCIsIG0uZ2V0RnJvbSgpLmdldCgwKS5nZXRBZGRyZXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MSA9IE1haWxib3gucGFyc2UoImpvaG4uZG9lQGV4YW1wbGUubmV0Iik7CisgICAgICAgIE1haWxib3ggbWFpbGJveDIgPSBNYWlsYm94LnBhcnNlKCJqYW5lLmRvZUBleGFtcGxlLm5ldCIpOworCisgICAgICAgIG0uc2V0RnJvbShtYWlsYm94MSk7CisgICAgICAgIGFzc2VydEVxdWFscygiam9obi5kb2VAZXhhbXBsZS5uZXQiLCBtLmdldEhlYWRlcigpLmdldEZpZWxkKCJGcm9tIikKKyAgICAgICAgICAgICAgICAuZ2V0Qm9keSgpKTsKKworICAgICAgICBtLnNldEZyb20obWFpbGJveDEsIG1haWxib3gyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqb2huLmRvZUBleGFtcGxlLm5ldCwgamFuZS5kb2VAZXhhbXBsZS5uZXQiLCBtCisgICAgICAgICAgICAgICAgLmdldEhlYWRlcigpLmdldEZpZWxkKCJGcm9tIikuZ2V0Qm9keSgpKTsKKworICAgICAgICBtLnNldEZyb20oQXJyYXlzLmFzTGlzdChtYWlsYm94MSwgbWFpbGJveDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqb2huLmRvZUBleGFtcGxlLm5ldCwgamFuZS5kb2VAZXhhbXBsZS5uZXQiLCBtCisgICAgICAgICAgICAgICAgLmdldEhlYWRlcigpLmdldEZpZWxkKCJGcm9tIikuZ2V0Qm9keSgpKTsKKworICAgICAgICBtLnNldEZyb20oKE1haWxib3gpIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKG0uZ2V0SGVhZGVyKCkuZ2V0RmllbGQoIkZyb20iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIGFzc2VydE51bGwobS5nZXRUbygpKTsKKworICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOworICAgICAgICBoZWFkZXIuc2V0RmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiVG86IGpvaG4uZG9lQGV4YW1wbGUubmV0IikpOworICAgICAgICBtLnNldEhlYWRlcihoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiam9obi5kb2VAZXhhbXBsZS5uZXQiLCAoKE1haWxib3gpIG0uZ2V0VG8oKS5nZXQoMCkpCisgICAgICAgICAgICAgICAgLmdldEFkZHJlc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldFRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MSA9IE1haWxib3gucGFyc2UoImpvaG4uZG9lQGV4YW1wbGUubmV0Iik7CisgICAgICAgIE1haWxib3ggbWFpbGJveDIgPSBNYWlsYm94LnBhcnNlKCJqYW5lLmRvZUBleGFtcGxlLm5ldCIpOworICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cCgiRG9lcyIsIG1haWxib3gxLCBtYWlsYm94Mik7CisgICAgICAgIE1haWxib3ggbWFpbGJveDMgPSBNYWlsYm94LnBhcnNlKCJNYXJ5IFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiIpOworCisgICAgICAgIG0uc2V0VG8oZ3JvdXApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRvZXM6IGpvaG4uZG9lQGV4YW1wbGUubmV0LCBqYW5lLmRvZUBleGFtcGxlLm5ldDsiLCBtCisgICAgICAgICAgICAgICAgLmdldEhlYWRlcigpLmdldEZpZWxkKCJUbyIpLmdldEJvZHkoKSk7CisKKyAgICAgICAgbS5zZXRUbyhncm91cCwgbWFpbGJveDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRvZXM6IGpvaG4uZG9lQGV4YW1wbGUubmV0LCBqYW5lLmRvZUBleGFtcGxlLm5ldDssICIKKyAgICAgICAgICAgICAgICArICJNYXJ5IFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiIsIG0uZ2V0SGVhZGVyKCkuZ2V0RmllbGQoIlRvIikKKyAgICAgICAgICAgICAgICAuZ2V0Qm9keSgpKTsKKworICAgICAgICBtLnNldFRvKEFycmF5cy5hc0xpc3QoZ3JvdXAsIG1haWxib3gzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG9lczogam9obi5kb2VAZXhhbXBsZS5uZXQsIGphbmUuZG9lQGV4YW1wbGUubmV0OywgIgorICAgICAgICAgICAgICAgICsgIk1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+IiwgbS5nZXRIZWFkZXIoKS5nZXRGaWVsZCgiVG8iKQorICAgICAgICAgICAgICAgIC5nZXRCb2R5KCkpOworCisgICAgICAgIG0uc2V0VG8oKE1haWxib3gpIG51bGwpOworICAgICAgICBhc3NlcnROdWxsKG0uZ2V0SGVhZGVyKCkuZ2V0RmllbGQoIlRvIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIG0gPSBuZXcgTWVzc2FnZSgpOworICAgICAgICBhc3NlcnROdWxsKG0uZ2V0Q2MoKSk7CisKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIkNjOiBqb2huLmRvZUBleGFtcGxlLm5ldCIpKTsKKyAgICAgICAgbS5zZXRIZWFkZXIoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImpvaG4uZG9lQGV4YW1wbGUubmV0IiwgKChNYWlsYm94KSBtLmdldENjKCkuZ2V0KDApKQorICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRDYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIG0gPSBuZXcgTWVzc2FnZSgpOworCisgICAgICAgIE1haWxib3ggbWFpbGJveDEgPSBNYWlsYm94LnBhcnNlKCJqb2huLmRvZUBleGFtcGxlLm5ldCIpOworICAgICAgICBNYWlsYm94IG1haWxib3gyID0gTWFpbGJveC5wYXJzZSgiamFuZS5kb2VAZXhhbXBsZS5uZXQiKTsKKyAgICAgICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoIkRvZXMiLCBtYWlsYm94MSwgbWFpbGJveDIpOworICAgICAgICBNYWlsYm94IG1haWxib3gzID0gTWFpbGJveC5wYXJzZSgiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iKTsKKworICAgICAgICBtLnNldENjKGdyb3VwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEb2VzOiBqb2huLmRvZUBleGFtcGxlLm5ldCwgamFuZS5kb2VAZXhhbXBsZS5uZXQ7IiwgbQorICAgICAgICAgICAgICAgIC5nZXRIZWFkZXIoKS5nZXRGaWVsZCgiQ2MiKS5nZXRCb2R5KCkpOworCisgICAgICAgIG0uc2V0Q2MoZ3JvdXAsIG1haWxib3gzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEb2VzOiBqb2huLmRvZUBleGFtcGxlLm5ldCwgamFuZS5kb2VAZXhhbXBsZS5uZXQ7LCAiCisgICAgICAgICAgICAgICAgKyAiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iLCBtLmdldEhlYWRlcigpLmdldEZpZWxkKCJDYyIpCisgICAgICAgICAgICAgICAgLmdldEJvZHkoKSk7CisKKyAgICAgICAgbS5zZXRDYyhBcnJheXMuYXNMaXN0KGdyb3VwLCBtYWlsYm94MykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRvZXM6IGpvaG4uZG9lQGV4YW1wbGUubmV0LCBqYW5lLmRvZUBleGFtcGxlLm5ldDssICIKKyAgICAgICAgICAgICAgICArICJNYXJ5IFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiIsIG0uZ2V0SGVhZGVyKCkuZ2V0RmllbGQoIkNjIikKKyAgICAgICAgICAgICAgICAuZ2V0Qm9keSgpKTsKKworICAgICAgICBtLnNldENjKChNYWlsYm94KSBudWxsKTsKKyAgICAgICAgYXNzZXJ0TnVsbChtLmdldEhlYWRlcigpLmdldEZpZWxkKCJDYyIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QmNjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIGFzc2VydE51bGwobS5nZXRCY2MoKSk7CisKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLnNldEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIkJjYzogam9obi5kb2VAZXhhbXBsZS5uZXQiKSk7CisgICAgICAgIG0uc2V0SGVhZGVyKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqb2huLmRvZUBleGFtcGxlLm5ldCIsICgoTWFpbGJveCkgbS5nZXRCY2MoKS5nZXQoMCkpCisgICAgICAgICAgICAgICAgLmdldEFkZHJlc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFNldEJjYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIG0gPSBuZXcgTWVzc2FnZSgpOworCisgICAgICAgIE1haWxib3ggbWFpbGJveDEgPSBNYWlsYm94LnBhcnNlKCJqb2huLmRvZUBleGFtcGxlLm5ldCIpOworICAgICAgICBNYWlsYm94IG1haWxib3gyID0gTWFpbGJveC5wYXJzZSgiamFuZS5kb2VAZXhhbXBsZS5uZXQiKTsKKyAgICAgICAgR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoIkRvZXMiLCBtYWlsYm94MSwgbWFpbGJveDIpOworICAgICAgICBNYWlsYm94IG1haWxib3gzID0gTWFpbGJveC5wYXJzZSgiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iKTsKKworICAgICAgICBtLnNldEJjYyhncm91cCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG9lczogam9obi5kb2VAZXhhbXBsZS5uZXQsIGphbmUuZG9lQGV4YW1wbGUubmV0OyIsIG0KKyAgICAgICAgICAgICAgICAuZ2V0SGVhZGVyKCkuZ2V0RmllbGQoIkJjYyIpLmdldEJvZHkoKSk7CisKKyAgICAgICAgbS5zZXRCY2MoZ3JvdXAsIG1haWxib3gzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEb2VzOiBqb2huLmRvZUBleGFtcGxlLm5ldCwgamFuZS5kb2VAZXhhbXBsZS5uZXQ7LCAiCisgICAgICAgICAgICAgICAgKyAiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iLCBtLmdldEhlYWRlcigpCisgICAgICAgICAgICAgICAgLmdldEZpZWxkKCJCY2MiKS5nZXRCb2R5KCkpOworCisgICAgICAgIG0uc2V0QmNjKEFycmF5cy5hc0xpc3QoZ3JvdXAsIG1haWxib3gzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG9lczogam9obi5kb2VAZXhhbXBsZS5uZXQsIGphbmUuZG9lQGV4YW1wbGUubmV0OywgIgorICAgICAgICAgICAgICAgICsgIk1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+IiwgbS5nZXRIZWFkZXIoKQorICAgICAgICAgICAgICAgIC5nZXRGaWVsZCgiQmNjIikuZ2V0Qm9keSgpKTsKKworICAgICAgICBtLnNldEJjYygoTWFpbGJveCkgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwobS5nZXRIZWFkZXIoKS5nZXRGaWVsZCgiQmNjIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXBseVRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIGFzc2VydE51bGwobS5nZXRSZXBseVRvKCkpOworCisgICAgICAgIEhlYWRlciBoZWFkZXIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgIGhlYWRlci5zZXRGaWVsZChBYnN0cmFjdEZpZWxkLnBhcnNlKCJSZXBseS1Ubzogam9obi5kb2VAZXhhbXBsZS5uZXQiKSk7CisgICAgICAgIG0uc2V0SGVhZGVyKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqb2huLmRvZUBleGFtcGxlLm5ldCIsICgoTWFpbGJveCkgbS5nZXRSZXBseVRvKCkuZ2V0KDApKQorICAgICAgICAgICAgICAgIC5nZXRBZGRyZXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRSZXBseVRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IG5ldyBNZXNzYWdlKCk7CisKKyAgICAgICAgTWFpbGJveCBtYWlsYm94MSA9IE1haWxib3gucGFyc2UoImpvaG4uZG9lQGV4YW1wbGUubmV0Iik7CisgICAgICAgIE1haWxib3ggbWFpbGJveDIgPSBNYWlsYm94LnBhcnNlKCJqYW5lLmRvZUBleGFtcGxlLm5ldCIpOworICAgICAgICBHcm91cCBncm91cCA9IG5ldyBHcm91cCgiRG9lcyIsIG1haWxib3gxLCBtYWlsYm94Mik7CisgICAgICAgIE1haWxib3ggbWFpbGJveDMgPSBNYWlsYm94LnBhcnNlKCJNYXJ5IFNtaXRoIDxtYXJ5QGV4YW1wbGUubmV0PiIpOworCisgICAgICAgIG0uc2V0UmVwbHlUbyhncm91cCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG9lczogam9obi5kb2VAZXhhbXBsZS5uZXQsIGphbmUuZG9lQGV4YW1wbGUubmV0OyIsIG0KKyAgICAgICAgICAgICAgICAuZ2V0SGVhZGVyKCkuZ2V0RmllbGQoIlJlcGx5LVRvIikuZ2V0Qm9keSgpKTsKKworICAgICAgICBtLnNldFJlcGx5VG8oZ3JvdXAsIG1haWxib3gzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEb2VzOiBqb2huLmRvZUBleGFtcGxlLm5ldCwgamFuZS5kb2VAZXhhbXBsZS5uZXQ7LCAiCisgICAgICAgICAgICAgICAgKyAiTWFyeSBTbWl0aCA8bWFyeUBleGFtcGxlLm5ldD4iLCBtLmdldEhlYWRlcigpLmdldEZpZWxkKAorICAgICAgICAgICAgICAgICJSZXBseS1UbyIpLmdldEJvZHkoKSk7CisKKyAgICAgICAgbS5zZXRSZXBseVRvKEFycmF5cy5hc0xpc3QoZ3JvdXAsIG1haWxib3gzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRG9lczogam9obi5kb2VAZXhhbXBsZS5uZXQsIGphbmUuZG9lQGV4YW1wbGUubmV0OywgIgorICAgICAgICAgICAgICAgICsgIk1hcnkgU21pdGggPG1hcnlAZXhhbXBsZS5uZXQ+IiwgbS5nZXRIZWFkZXIoKS5nZXRGaWVsZCgKKyAgICAgICAgICAgICAgICAiUmVwbHktVG8iKS5nZXRCb2R5KCkpOworCisgICAgICAgIG0uc2V0UmVwbHlUbygoTWFpbGJveCkgbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwobS5nZXRIZWFkZXIoKS5nZXRGaWVsZCgiUmVwbHktVG8iKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERpc3Bvc2VHZXRzUHJvcGFnYXRlZFRvQm9keSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEdW1teUJvZHkgYm9keTEgPSBuZXcgRHVtbXlCb2R5KCk7CisgICAgICAgIEJvZHlQYXJ0IHBhcnQxID0gbmV3IEJvZHlQYXJ0KCk7CisgICAgICAgIHBhcnQxLnNldEhlYWRlcihoZWFkZXJFbXB0eSk7CisgICAgICAgIHBhcnQxLnNldEJvZHkoYm9keTEpOworCisgICAgICAgIER1bW15Qm9keSBib2R5MiA9IG5ldyBEdW1teUJvZHkoKTsKKyAgICAgICAgQm9keVBhcnQgcGFydDIgPSBuZXcgQm9keVBhcnQoKTsKKyAgICAgICAgcGFydDIuc2V0SGVhZGVyKGhlYWRlckVtcHR5KTsKKyAgICAgICAgcGFydDIuc2V0Qm9keShib2R5Mik7CisKKyAgICAgICAgTXVsdGlwYXJ0IG1wID0gbmV3IE11bHRpcGFydCgibWl4ZWQiKTsKKyAgICAgICAgbXAuYWRkQm9keVBhcnQocGFydDEpOworICAgICAgICBtcC5hZGRCb2R5UGFydChwYXJ0Mik7CisKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgbS5zZXRIZWFkZXIoaGVhZGVyTXVsdGlwYXJ0TWl4ZWQpOworICAgICAgICBtLnNldEJvZHkobXApOworCisgICAgICAgIGFzc2VydEZhbHNlKGJvZHkxLmRpc3Bvc2VkKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYm9keTIuZGlzcG9zZWQpOworCisgICAgICAgIG0uZGlzcG9zZSgpOworCisgICAgICAgIGFzc2VydFRydWUoYm9keTEuZGlzcG9zZWQpOworICAgICAgICBhc3NlcnRUcnVlKGJvZHkyLmRpc3Bvc2VkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJ5dGVbXSBnZXRSYXdNZXNzYWdlQXNCeXRlQXJyYXkoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgaGVhZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBib2R5ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBjb21wbGV0ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiRGF0ZTogV2VkLCAyMSBGZWIgMjAwNyAxMTowOToyNyArMDEwMFxyXG4iKTsKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiRnJvbTogVGVzdCA8dGVzdEB0ZXN0PlxyXG4iKTsKKyAgICAgICAgaGVhZGVyLmFwcGVuZCgiVG86IE5vcm1hbiBNYXVyZXIgPG5tQGJ5dGVhY3Rpb24uZGU+XHJcbiIpOworICAgICAgICBoZWFkZXIuYXBwZW5kKCJTdWJqZWN0OiBUZXN0bWFpbFxyXG4iKTsKKyAgICAgICAgaGVhZGVyCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1OyBmb3JtYXQ9Zmxvd2VkXHJcbiIpOworICAgICAgICBoZWFkZXIuYXBwZW5kKCJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XHJcblxyXG4iKTsKKyAgICAgICAgYm9keS5hcHBlbmQoInRlc3Rib2R5XHJcbiIpOworICAgICAgICBjb21wbGV0ZS5hcHBlbmQoaGVhZGVyKTsKKyAgICAgICAgY29tcGxldGUuYXBwZW5kKGJvZHkpOworCisgICAgICAgIHJldHVybiBjb21wbGV0ZS50b1N0cmluZygpLmdldEJ5dGVzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRHVtbXlCb2R5IGV4dGVuZHMgU2luZ2xlQm9keSB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzcG9zZWQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgb3V0LndyaXRlKCJkdW1teSIuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgICAgICBkaXNwb3NlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VXcml0ZVRvVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL01lc3NhZ2VXcml0ZVRvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzNjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTWVzc2FnZVdyaXRlVG9UZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5tZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLkV4YW1wbGVNYWlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgTWVzc2FnZVdyaXRlVG9UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTWFpbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIG1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlKEV4YW1wbGVNYWlsLlJGQzgyMl9TSU1QTEVfQllURVMpOworICAgICAgICBhc3NlcnRGYWxzZSgiTm90IG11bHRpcGFydCIsIG1lc3NhZ2UuaXNNdWx0aXBhcnQoKSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIG1lc3NhZ2Uud3JpdGVUbyhvdXQpOworICAgICAgICBhc3NlcnRFcXVhbHMob3V0LnRvQnl0ZUFycmF5KCksIEV4YW1wbGVNYWlsLlJGQzgyMl9TSU1QTEVfQllURVMpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzKGJ5dGVbXSBleHBlY3RlZCwgYnl0ZVtdIGFjdHVhbCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGV4cGVjdGVkLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGFjdHVhbC5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgoY2hhcilhY3R1YWxbaV0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaXNtYXRjaEAiICsgaSwgZXhwZWN0ZWRbaV0sIGFjdHVhbFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEJpbmFyeUF0dGFjaG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gY3JlYXRlTWVzc2FnZShFeGFtcGxlTWFpbC5NVUxUSVBBUlRfV0lUSF9CSU5BUllfQVRUQUNITUVOVFNfQllURVMpOworICAgICAgICBhc3NlcnRUcnVlKCJJcyBtdWx0aXBhcnQiLCBtZXNzYWdlLmlzTXVsdGlwYXJ0KCkpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBtZXNzYWdlLndyaXRlVG8ob3V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEV4YW1wbGVNYWlsLk1VTFRJUEFSVF9XSVRIX0JJTkFSWV9BVFRBQ0hNRU5UU19CWVRFUywgb3V0LnRvQnl0ZUFycmF5KCkpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIE1lc3NhZ2UgY3JlYXRlTWVzc2FnZShieXRlW10gb2N0ZXRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob2N0ZXRzKTsKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoaW4pOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTXVsdGlwYXJ0Rm9ybVRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9NdWx0aXBhcnRGb3JtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4N2Q1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL21lc3NhZ2UvTXVsdGlwYXJ0Rm9ybVRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmZpZWxkLkFic3RyYWN0RmllbGQ7CisKK3B1YmxpYyBjbGFzcyBNdWx0aXBhcnRGb3JtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBhcnRGb3JtQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCb2R5RmFjdG9yeSBib2R5RmFjdG9yeSA9IG5ldyBCb2R5RmFjdG9yeSgpOworICAgICAgICAKKyAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKKyAgICAgICAgSGVhZGVyIGhlYWRlciA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgaGVhZGVyLmFkZEZpZWxkKAorICAgICAgICAgICAgICAgIEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9Zm9vIikpOworICAgICAgICBtZXNzYWdlLnNldEhlYWRlcihoZWFkZXIpOworICAgICAgICAKKyAgICAgICAgTXVsdGlwYXJ0IG11bHRpcGFydCA9IG5ldyBNdWx0aXBhcnQoImFsdGVybmF0aXZlIik7CisgICAgICAgIG11bHRpcGFydC5zZXRQYXJlbnQobWVzc2FnZSk7CisgICAgICAgIEJvZHlQYXJ0IHAxID0gbmV3IEJvZHlQYXJ0KCk7CisgICAgICAgIEhlYWRlciBoMSA9IG5ldyBIZWFkZXIoKTsKKyAgICAgICAgaDEuYWRkRmllbGQoQWJzdHJhY3RGaWVsZC5wYXJzZSgiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIikpOworICAgICAgICBwMS5zZXRIZWFkZXIoaDEpOworICAgICAgICBwMS5zZXRCb2R5KGJvZHlGYWN0b3J5LnRleHRCb2R5KCJ0aGlzIHN0dWZmIikpOworICAgICAgICBCb2R5UGFydCBwMiA9IG5ldyBCb2R5UGFydCgpOworICAgICAgICBIZWFkZXIgaDIgPSBuZXcgSGVhZGVyKCk7CisgICAgICAgIGgyLmFkZEZpZWxkKEFic3RyYWN0RmllbGQucGFyc2UoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIpKTsKKyAgICAgICAgcDIuc2V0SGVhZGVyKGgyKTsKKyAgICAgICAgcDIuc2V0Qm9keShib2R5RmFjdG9yeS50ZXh0Qm9keSgidGhhdCBzdHVmZiIpKTsKKyAgICAgICAgQm9keVBhcnQgcDMgPSBuZXcgQm9keVBhcnQoKTsKKyAgICAgICAgSGVhZGVyIGgzID0gbmV3IEhlYWRlcigpOworICAgICAgICBoMy5hZGRGaWVsZChBYnN0cmFjdEZpZWxkLnBhcnNlKCJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iKSk7CisgICAgICAgIHAzLnNldEhlYWRlcihoMyk7CisgICAgICAgIHAzLnNldEJvZHkoYm9keUZhY3RvcnkudGV4dEJvZHkoImFsbCBraW5kIG9mIHN0dWZmIikpOworCisgICAgICAgIG11bHRpcGFydC5hZGRCb2R5UGFydChwMSk7CisgICAgICAgIG11bHRpcGFydC5hZGRCb2R5UGFydChwMik7CisgICAgICAgIG11bHRpcGFydC5hZGRCb2R5UGFydChwMyk7CisgICAgICAgIAorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBNZXNzYWdlV3JpdGVyLkRFRkFVTFQud3JpdGVNdWx0aXBhcnQobXVsdGlwYXJ0LCBvdXQpOworICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJcclxuIiArIAorICAgICAgICAgICAgIi0tZm9vXHJcbiIgKworICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblxyXG4iICsKKyAgICAgICAgICAgICJcclxuIiArCisgICAgICAgICAgICAidGhpcyBzdHVmZlxyXG4iICsKKyAgICAgICAgICAgICItLWZvb1xyXG4iICsKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIiArCisgICAgICAgICAgICAiXHJcbiIgKworICAgICAgICAgICAgInRoYXQgc3R1ZmZcclxuIiArCisgICAgICAgICAgICAiLS1mb29cclxuIiArCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIgKworICAgICAgICAgICAgIlxyXG4iICsKKyAgICAgICAgICAgICJhbGwga2luZCBvZiBzdHVmZlxyXG4iICsKKyAgICAgICAgICAgICItLWZvby0tXHJcbiI7CisgICAgICAgIFN0cmluZyBzID0gb3V0LnRvU3RyaW5nKCJVUy1BU0NJSSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHMpOworICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9TaW5nbGVCb2R5Q29weVRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovbWVzc2FnZS9TaW5nbGVCb2R5Q29weVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2YwYWM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9tZXNzYWdlL1NpbmdsZUJvZHlDb3B5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZS5NZW1vcnlTdG9yYWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZS5NdWx0aVJlZmVyZW5jZVN0b3JhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZS5TdG9yYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CisKK3B1YmxpYyBjbGFzcyBTaW5nbGVCb2R5Q29weVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weVN0b3JhZ2VCaW5hcnlCb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2Ugc3RvcmFnZSA9IG5ldyBNZW1vcnlTdG9yYWdlUHJvdmlkZXIoKQorICAgICAgICAgICAgICAgIC5zdG9yZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oInRlc3QiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgTXVsdGlSZWZlcmVuY2VTdG9yYWdlIG11bHRpUmVmZXJlbmNlU3RvcmFnZSA9IG5ldyBNdWx0aVJlZmVyZW5jZVN0b3JhZ2UoCisgICAgICAgICAgICAgICAgc3RvcmFnZSk7CisgICAgICAgIFNpbmdsZUJvZHkgYm9keSA9IG5ldyBTdG9yYWdlQmluYXJ5Qm9keShtdWx0aVJlZmVyZW5jZVN0b3JhZ2UpOworICAgICAgICBjb3B5VGVzdChib2R5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29weVN0b3JhZ2VUZXh0Qm9keSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdG9yYWdlIHN0b3JhZ2UgPSBuZXcgTWVtb3J5U3RvcmFnZVByb3ZpZGVyKCkKKyAgICAgICAgICAgICAgICAuc3RvcmUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJ0ZXN0Ii5nZXRCeXRlcygpKSk7CisgICAgICAgIE11bHRpUmVmZXJlbmNlU3RvcmFnZSBtdWx0aVJlZmVyZW5jZVN0b3JhZ2UgPSBuZXcgTXVsdGlSZWZlcmVuY2VTdG9yYWdlKAorICAgICAgICAgICAgICAgIHN0b3JhZ2UpOworICAgICAgICBTaW5nbGVCb2R5IGJvZHkgPSBuZXcgU3RvcmFnZVRleHRCb2R5KG11bHRpUmVmZXJlbmNlU3RvcmFnZSwKKyAgICAgICAgICAgICAgICBDaGFyc2V0VXRpbC5VU19BU0NJSSk7CisgICAgICAgIGNvcHlUZXN0KGJvZHkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RDb3B5U3RyaW5nVGV4dEJvZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU2luZ2xlQm9keSBib2R5ID0gbmV3IFN0cmluZ1RleHRCb2R5KCJ0ZXN0IiwgQ2hhcnNldFV0aWwuVVNfQVNDSUkpOworICAgICAgICBjb3B5VGVzdChib2R5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZVN0b3JhZ2VCaW5hcnlCb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2Ugc3RvcmFnZSA9IG5ldyBNZW1vcnlTdG9yYWdlUHJvdmlkZXIoKQorICAgICAgICAgICAgICAgIC5zdG9yZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oInRlc3QiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgTXVsdGlSZWZlcmVuY2VTdG9yYWdlIG11bHRpUmVmZXJlbmNlU3RvcmFnZSA9IG5ldyBNdWx0aVJlZmVyZW5jZVN0b3JhZ2UoCisgICAgICAgICAgICAgICAgc3RvcmFnZSk7CisgICAgICAgIFNpbmdsZUJvZHkgYm9keSA9IG5ldyBTdG9yYWdlQmluYXJ5Qm9keShtdWx0aVJlZmVyZW5jZVN0b3JhZ2UpOworICAgICAgICBkaXNwb3NlVGVzdChib2R5LCBzdG9yYWdlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZVN0b3JhZ2VUZXh0Qm9keSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdG9yYWdlIHN0b3JhZ2UgPSBuZXcgTWVtb3J5U3RvcmFnZVByb3ZpZGVyKCkKKyAgICAgICAgICAgICAgICAuc3RvcmUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJ0ZXN0Ii5nZXRCeXRlcygpKSk7CisgICAgICAgIE11bHRpUmVmZXJlbmNlU3RvcmFnZSBtdWx0aVJlZmVyZW5jZVN0b3JhZ2UgPSBuZXcgTXVsdGlSZWZlcmVuY2VTdG9yYWdlKAorICAgICAgICAgICAgICAgIHN0b3JhZ2UpOworICAgICAgICBTaW5nbGVCb2R5IGJvZHkgPSBuZXcgU3RvcmFnZVRleHRCb2R5KG11bHRpUmVmZXJlbmNlU3RvcmFnZSwKKyAgICAgICAgICAgICAgICBDaGFyc2V0VXRpbC5VU19BU0NJSSk7CisgICAgICAgIGRpc3Bvc2VUZXN0KGJvZHksIHN0b3JhZ2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb3B5VGVzdChTaW5nbGVCb2R5IGJvZHkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNZXNzYWdlIHBhcmVudCA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIHBhcmVudC5zZXRCb2R5KGJvZHkpOworCisgICAgICAgIFNpbmdsZUJvZHkgY29weSA9IGJvZHkuY29weSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvcHkpOworICAgICAgICBhc3NlcnROb3RTYW1lKGJvZHksIGNvcHkpOworCisgICAgICAgIGFzc2VydFNhbWUocGFyZW50LCBib2R5LmdldFBhcmVudCgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb3B5LmdldFBhcmVudCgpKTsKKworICAgICAgICBzYW1lQ29udGVudFRlc3QoYm9keSwgY29weSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNhbWVDb250ZW50VGVzdChTaW5nbGVCb2R5IGV4cGVjdGVkQm9keSwgU2luZ2xlQm9keSBhY3R1YWxCb2R5KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHBCYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBleHBlY3RlZEJvZHkud3JpdGVUbyhleHBCYW9zKTsKKyAgICAgICAgYnl0ZVtdIGV4cGVjdGVkID0gZXhwQmFvcy50b0J5dGVBcnJheSgpOworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhY3RCYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBhY3R1YWxCb2R5LndyaXRlVG8oYWN0QmFvcyk7CisgICAgICAgIGJ5dGVbXSBhY3R1YWwgPSBhY3RCYW9zLnRvQnl0ZUFycmF5KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgYWN0dWFsLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNwb3NlVGVzdChTaW5nbGVCb2R5IGJvZHksIFN0b3JhZ2Ugc3RvcmFnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRydWUoc3RvcmFnZUlzUmVhZGFibGUoc3RvcmFnZSkpOworCisgICAgICAgIFNpbmdsZUJvZHkgY29weSA9IGJvZHkuY29weSgpOworICAgICAgICBhc3NlcnRUcnVlKHN0b3JhZ2VJc1JlYWRhYmxlKHN0b3JhZ2UpKTsKKworICAgICAgICBib2R5LmRpc3Bvc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdG9yYWdlSXNSZWFkYWJsZShzdG9yYWdlKSk7CisKKyAgICAgICAgY29weS5kaXNwb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKHN0b3JhZ2VJc1JlYWRhYmxlKHN0b3JhZ2UpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RvcmFnZUlzUmVhZGFibGUoU3RvcmFnZSBzdG9yYWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JhZ2UuZ2V0SW5wdXRTdHJlYW0oKS5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVFbnRpdHlUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTllZjAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKg0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKg0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7DQorDQoraW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07DQoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQorDQoraW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5JT1V0aWxzOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5pby5CdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uTWF4SGVhZGVyTGltaXRFeGNlcHRpb247DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmlvLk1heExpbmVMaW1pdEV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouaW8uTGluZU51bWJlcklucHV0U3RyZWFtOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRW50aXR5U3RhdGVNYWNoaW5lOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRW50aXR5U3RhdGVzOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZUVudGl0eTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLlJlY3Vyc2lvbk1vZGU7DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgTWltZUVudGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gDQorICAgICAgICAgICAgIlRvOiBSb2FkIFJ1bm5lciA8cnVubmVyQGV4YW1wbGUub3JnPlxyXG4iICsNCisgICAgICAgICAgICAiRnJvbTogV2lsZSBFLiBDYXlvdGUgPHdpbGVAZXhhbXBsZS5vcmc+XHJcbiIgKw0KKyAgICAgICAgICAgICJEYXRlOiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpXHJcbiIgKw0KKyAgICAgICAgICAgICJTdWJqZWN0OiBNYWlsXHJcbiIgKw0KKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIiArDQorICAgICAgICAgICAgIlxyXG4iICsNCisgICAgICAgICAgICAiYSB2ZXJ5IGltcG9ydGFudCBtZXNzYWdlIjsNCisgICAgICAgIGJ5dGVbXSByYXcgPSBtZXNzYWdlLmdldEJ5dGVzKCJVUy1BU0NJSSIpOw0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmF3KTsNCisgICAgICAgIExpbmVOdW1iZXJJbnB1dFN0cmVhbSBsaW5lSW5wdXQgPSBuZXcgTGluZU51bWJlcklucHV0U3RyZWFtKGluc3RyZWFtKTsgDQorICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSByYXdzdHJlYW0gPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0obGluZUlucHV0LCAxMik7IA0KKyAgICAgICAgDQorICAgICAgICBNaW1lRW50aXR5IGVudGl0eSA9IG5ldyBNaW1lRW50aXR5KA0KKyAgICAgICAgICAgICAgICBsaW5lSW5wdXQsDQorICAgICAgICAgICAgICAgIHJhd3N0cmVhbSwNCisgICAgICAgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgICAgICAgRW50aXR5U3RhdGVzLlRfU1RBUlRfTUVTU0FHRSwNCisgICAgICAgICAgICAgICAgRW50aXR5U3RhdGVzLlRfRU5EX01FU1NBR0UpOw0KKyAgICAgICAgDQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1NUQVJUX0hFQURFUiwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUbyIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBSb2FkIFJ1bm5lciA8cnVubmVyQGV4YW1wbGUub3JnPiIsIGVudGl0eS5nZXRGaWVsZCgpLmdldEJvZHkoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb20iLCBlbnRpdHkuZ2V0RmllbGQoKS5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgV2lsZSBFLiBDYXlvdGUgPHdpbGVAZXhhbXBsZS5vcmc+IiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiRGF0ZSIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiU3ViamVjdCIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBNYWlsIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiQ29udGVudC1UeXBlIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0TmFtZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiIHRleHQvcGxhaW4iLCBlbnRpdHkuZ2V0RmllbGQoKS5nZXRCb2R5KCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9FTkRfSEVBREVSLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKTsNCisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsNCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgew0KKyAgICAgICAgfQ0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBlbnRpdHkuZ2V0RmllbGQoKS5nZXRCb2R5KCk7DQorICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7DQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsNCisgICAgICAgIH0NCisgICAgICAgIA0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9CT0RZLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImEgdmVyeSBpbXBvcnRhbnQgbWVzc2FnZSIsIElPVXRpbHMudG9TdHJpbmcoZW50aXR5LmdldENvbnRlbnRTdHJlYW0oKSkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9FTkRfTUVTU0FHRSwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBlbnRpdHkuZ2V0Q29udGVudFN0cmVhbSgpOw0KKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOw0KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7DQorICAgICAgICB9DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0VORF9PRl9TVFJFQU0sIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIHRyeSB7DQorICAgICAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsNCisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgew0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBhcnRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gDQorICAgICAgICAgICAgIlRvOiBSb2FkIFJ1bm5lciA8cnVubmVyQGV4YW1wbGUub3JnPlxyXG4iICsNCisgICAgICAgICAgICAiRnJvbTogV2lsZSBFLiBDYXlvdGUgPHdpbGVAZXhhbXBsZS5vcmc+XHJcbiIgKw0KKyAgICAgICAgICAgICJEYXRlOiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpXHJcbiIgKw0KKyAgICAgICAgICAgICJTdWJqZWN0OiBNYWlsXHJcbiIgKw0KKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDtib3VuZGFyeT0xNzI5XHJcbiIgKw0KKyAgICAgICAgICAgICJcclxuIiArDQorICAgICAgICAgICAgIkhlbGxvIVxyXG4iICsNCisgICAgICAgICAgICAiLS0xNzI5XHJcbiIgKw0KKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArDQorICAgICAgICAgICAgIlxyXG4iICsNCisgICAgICAgICAgICAiYmxhaCBibGFoIGJsYWhcclxuIiArDQorICAgICAgICAgICAgIi0tMTcyOVxyXG4iICsNCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcbiIgKw0KKyAgICAgICAgICAgICJcclxuIiArDQorICAgICAgICAgICAgInlhZGEgeWFkYSB5YWRhXHJcbiIgKw0KKyAgICAgICAgICAgICItLTE3MjktLVxyXG4iICsNCisgICAgICAgICAgICAiR29vZGJ5ZSEiOw0KKyAgICAgICAgYnl0ZVtdIHJhdyA9IG1lc3NhZ2UuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7DQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXcpOw0KKyAgICAgICAgTGluZU51bWJlcklucHV0U3RyZWFtIGxpbmVJbnB1dCA9IG5ldyBMaW5lTnVtYmVySW5wdXRTdHJlYW0oaW5zdHJlYW0pOyANCisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIHJhd3N0cmVhbSA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbShsaW5lSW5wdXQsIDI0KTsgDQorICAgICAgICANCisgICAgICAgIE1pbWVFbnRpdHkgZW50aXR5ID0gbmV3IE1pbWVFbnRpdHkoDQorICAgICAgICAgICAgICAgIGxpbmVJbnB1dCwNCisgICAgICAgICAgICAgICAgcmF3c3RyZWFtLA0KKyAgICAgICAgICAgICAgICBudWxsLA0KKyAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFLA0KKyAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9FTkRfTUVTU0FHRSk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1NUQVJUX0hFQURFUiwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUbyIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBSb2FkIFJ1bm5lciA8cnVubmVyQGV4YW1wbGUub3JnPiIsIGVudGl0eS5nZXRGaWVsZCgpLmdldEJvZHkoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb20iLCBlbnRpdHkuZ2V0RmllbGQoKS5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgV2lsZSBFLiBDYXlvdGUgPHdpbGVAZXhhbXBsZS5vcmc+IiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiRGF0ZSIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiU3ViamVjdCIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBNYWlsIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiQ29udGVudC1UeXBlIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0TmFtZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiIG11bHRpcGFydC9taXhlZDtib3VuZGFyeT0xNzI5IiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRU5EX0hFQURFUiwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NVUxUSVBBUlQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfUFJFQU1CTEUsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8hIiwgSU9VdGlscy50b1N0cmluZyhlbnRpdHkuZ2V0Q29udGVudFN0cmVhbSgpKSk7DQorICAgICAgICANCisgICAgICAgIEVudGl0eVN0YXRlTWFjaGluZSBwMSA9IGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnROb3ROdWxsKHAxKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1NUQVJUX0JPRFlQQVJULCBwMS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIHAxLmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9IRUFERVIsIHAxLmdldFN0YXRlKCkpOw0KKyAgICAgICAgcDEuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBwMS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiQ29udGVudC1UeXBlIiwgcDEuZ2V0RmllbGQoKS5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSSIsIHAxLmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIHAxLmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9FTkRfSEVBREVSLCBwMS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIHAxLmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9CT0RZLCBwMS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiYmxhaCBibGFoIGJsYWgiLCBJT1V0aWxzLnRvU3RyaW5nKHAxLmdldENvbnRlbnRTdHJlYW0oKSkpOw0KKyAgICAgICAgcDEuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0VORF9CT0RZUEFSVCwgcDEuZ2V0U3RhdGUoKSk7DQorICAgICAgICBwMS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRU5EX09GX1NUUkVBTSwgcDEuZ2V0U3RhdGUoKSk7DQorDQorICAgICAgICBFbnRpdHlTdGF0ZU1hY2hpbmUgcDIgPSBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwMik7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9CT0RZUEFSVCwgcDIuZ2V0U3RhdGUoKSk7DQorICAgICAgICBwMi5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSLCBwMi5nZXRTdGF0ZSgpKTsNCisgICAgICAgIHAyLmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCwgcDIuZ2V0U3RhdGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkNvbnRlbnQtVHlwZSIsIHAyLmdldEZpZWxkKCkuZ2V0TmFtZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiIHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUkiLCBwMi5nZXRGaWVsZCgpLmdldEJvZHkoKSk7DQorICAgICAgICBwMi5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRU5EX0hFQURFUiwgcDIuZ2V0U3RhdGUoKSk7DQorICAgICAgICBwMi5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfQk9EWSwgcDIuZ2V0U3RhdGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInlhZGEgeWFkYSB5YWRhIiwgSU9VdGlscy50b1N0cmluZyhwMi5nZXRDb250ZW50U3RyZWFtKCkpKTsNCisgICAgICAgIHAyLmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9FTkRfQk9EWVBBUlQsIHAyLmdldFN0YXRlKCkpOw0KKyAgICAgICAgcDIuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0VORF9PRl9TVFJFQU0sIHAyLmdldFN0YXRlKCkpOw0KKw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9FUElMT0dVRSwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb29kYnllISIsIElPVXRpbHMudG9TdHJpbmcoZW50aXR5LmdldENvbnRlbnRTdHJlYW0oKSkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9FTkRfTVVMVElQQVJULCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0VORF9NRVNTQUdFLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0VORF9PRl9TVFJFQU0sIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdFJhd0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSANCisgICAgICAgICAgICAiVG86IFJvYWQgUnVubmVyIDxydW5uZXJAZXhhbXBsZS5vcmc+XHJcbiIgKw0KKyAgICAgICAgICAgICJGcm9tOiBXaWxlIEUuIENheW90ZSA8d2lsZUBleGFtcGxlLm9yZz5cclxuIiArDQorICAgICAgICAgICAgIkRhdGU6IFR1ZSwgMTIgRmViIDIwMDggMTc6MzQ6MDkgKzAwMDAgKEdNVClcclxuIiArDQorICAgICAgICAgICAgIlN1YmplY3Q6IE1haWxcclxuIiArDQorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PTE3MjlcclxuIiArDQorICAgICAgICAgICAgIlxyXG4iICsNCisgICAgICAgICAgICAiSGVsbG8hXHJcbiIgKw0KKyAgICAgICAgICAgICItLTE3MjlcclxuIiArDQorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG4iICsNCisgICAgICAgICAgICAiXHJcbiIgKw0KKyAgICAgICAgICAgICJibGFoIGJsYWggYmxhaFxyXG4iICsNCisgICAgICAgICAgICAiLS0xNzI5XHJcbiIgKw0KKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArDQorICAgICAgICAgICAgIlxyXG4iICsNCisgICAgICAgICAgICAieWFkYSB5YWRhIHlhZGFcclxuIiArDQorICAgICAgICAgICAgIi0tMTcyOS0tXHJcbiIgKw0KKyAgICAgICAgICAgICJHb29kYnllISI7DQorICAgICAgICBieXRlW10gcmF3ID0gbWVzc2FnZS5nZXRCeXRlcygiVVMtQVNDSUkiKTsNCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJhdyk7DQorICAgICAgICBMaW5lTnVtYmVySW5wdXRTdHJlYW0gbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJJbnB1dFN0cmVhbShpbnN0cmVhbSk7IA0KKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gcmF3c3RyZWFtID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKGxpbmVJbnB1dCwgMjQpOyANCisgICAgICAgIA0KKyAgICAgICAgTWltZUVudGl0eSBlbnRpdHkgPSBuZXcgTWltZUVudGl0eSgNCisgICAgICAgICAgICAgICAgbGluZUlucHV0LA0KKyAgICAgICAgICAgICAgICByYXdzdHJlYW0sDQorICAgICAgICAgICAgICAgIG51bGwsDQorICAgICAgICAgICAgICAgIEVudGl0eVN0YXRlcy5UX1NUQVJUX01FU1NBR0UsDQorICAgICAgICAgICAgICAgIEVudGl0eVN0YXRlcy5UX0VORF9NRVNTQUdFKTsNCisgICAgICAgIA0KKyAgICAgICAgZW50aXR5LnNldFJlY3Vyc2lvbk1vZGUoUmVjdXJzaW9uTW9kZS5NX1JBVyk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1NUQVJUX0hFQURFUiwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUbyIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBSb2FkIFJ1bm5lciA8cnVubmVyQGV4YW1wbGUub3JnPiIsIGVudGl0eS5nZXRGaWVsZCgpLmdldEJvZHkoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkZyb20iLCBlbnRpdHkuZ2V0RmllbGQoKS5nZXROYW1lKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgV2lsZSBFLiBDYXlvdGUgPHdpbGVAZXhhbXBsZS5vcmc+IiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiRGF0ZSIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiU3ViamVjdCIsIGVudGl0eS5nZXRGaWVsZCgpLmdldE5hbWUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIiBNYWlsIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRklFTEQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiQ29udGVudC1UeXBlIiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0TmFtZSgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiIG11bHRpcGFydC9taXhlZDtib3VuZGFyeT0xNzI5IiwgZW50aXR5LmdldEZpZWxkKCkuZ2V0Qm9keSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRU5EX0hFQURFUiwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NVUxUSVBBUlQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIA0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9QUkVBTUJMRSwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyEiLCBJT1V0aWxzLnRvU3RyaW5nKGVudGl0eS5nZXRDb250ZW50U3RyZWFtKCkpKTsNCisgICAgICAgIA0KKyAgICAgICAgRW50aXR5U3RhdGVNYWNoaW5lIHAxID0gZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydE5vdE51bGwocDEpOw0KKyAgICAgICAgDQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfUkFXX0VOVElUWSwgcDEuZ2V0U3RhdGUoKSk7DQorICAgICAgICBhc3NlcnROdWxsKHAxLmdldEJvZHlEZXNjcmlwdG9yKCkpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChwMS5nZXRGaWVsZCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygNCisgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG4iICsNCisgICAgICAgICAgICAgICAgIlxyXG4iICsNCisgICAgICAgICAgICAgICAgImJsYWggYmxhaCBibGFoIiwgSU9VdGlscy50b1N0cmluZyhwMS5nZXRDb250ZW50U3RyZWFtKCkpKTsNCisgICAgICAgIHAxLmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9FTkRfT0ZfU1RSRUFNLCBwMS5nZXRTdGF0ZSgpKTsNCisNCisgICAgICAgIEVudGl0eVN0YXRlTWFjaGluZSBwMiA9IGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnROb3ROdWxsKHAyKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1JBV19FTlRJVFksIHAyLmdldFN0YXRlKCkpOw0KKyAgICAgICAgYXNzZXJ0TnVsbChwMi5nZXRCb2R5RGVzY3JpcHRvcigpKTsNCisgICAgICAgIGFzc2VydE51bGwocDIuZ2V0RmllbGQoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoDQorICAgICAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuIiArDQorICAgICAgICAgICAgICAgICJcclxuIiArDQorICAgICAgICAgICAgICAgICJ5YWRhIHlhZGEgeWFkYSIsIElPVXRpbHMudG9TdHJpbmcocDIuZ2V0Q29udGVudFN0cmVhbSgpKSk7DQorICAgICAgICBwMi5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRU5EX09GX1NUUkVBTSwgcDIuZ2V0U3RhdGUoKSk7DQorDQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0VQSUxPR1VFLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIkdvb2RieWUhIiwgSU9VdGlscy50b1N0cmluZyhlbnRpdHkuZ2V0Q29udGVudFN0cmVhbSgpKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0VORF9NVUxUSVBBUlQsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRU5EX01FU1NBR0UsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfRU5EX09GX1NUUkVBTSwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhMaW5lTGltaXRDaGVjaygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSANCisgICAgICAgICAgICAiVG86IFJvYWQgUnVubmVyIDxydW5uZXJAZXhhbXBsZS5vcmc+XHJcbiIgKw0KKyAgICAgICAgICAgICJGcm9tOiBXaWxlIEUuIENheW90ZSA8d2lsZUBleGFtcGxlLm9yZz5cclxuIiArDQorICAgICAgICAgICAgIkRhdGU6IFR1ZSwgMTIgRmViIDIwMDggMTc6MzQ6MDkgKzAwMDAgKEdNVClcclxuIiArDQorICAgICAgICAgICAgIlN1YmplY3Q6IE1haWxcclxuIiArDQorICAgICAgICAgICAgIkRvUzogeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4XHJcbiIgKw0KKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIiArDQorICAgICAgICAgICAgIlxyXG4iICsNCisgICAgICAgICAgICAiYSB2ZXJ5IGltcG9ydGFudCBtZXNzYWdlIjsNCisgICAgICAgIGJ5dGVbXSByYXcgPSBtZXNzYWdlLmdldEJ5dGVzKCJVUy1BU0NJSSIpOw0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmF3KTsNCisgICAgICAgIExpbmVOdW1iZXJJbnB1dFN0cmVhbSBsaW5lSW5wdXQgPSBuZXcgTGluZU51bWJlcklucHV0U3RyZWFtKGluc3RyZWFtKTsgDQorICAgICAgICBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbSByYXdzdHJlYW0gPSBuZXcgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0obGluZUlucHV0LCAxMik7IA0KKyAgICAgICAgDQorICAgICAgICBNaW1lRW50aXR5Q29uZmlnIGNvbmZpZyA9IG5ldyBNaW1lRW50aXR5Q29uZmlnKCk7DQorICAgICAgICBjb25maWcuc2V0TWF4TGluZUxlbig1MCk7DQorICAgICAgICBNaW1lRW50aXR5IGVudGl0eSA9IG5ldyBNaW1lRW50aXR5KA0KKyAgICAgICAgICAgICAgICBsaW5lSW5wdXQsDQorICAgICAgICAgICAgICAgIHJhd3N0cmVhbSwNCisgICAgICAgICAgICAgICAgbnVsbCwNCisgICAgICAgICAgICAgICAgRW50aXR5U3RhdGVzLlRfU1RBUlRfTUVTU0FHRSwNCisgICAgICAgICAgICAgICAgRW50aXR5U3RhdGVzLlRfRU5EX01FU1NBR0UsDQorICAgICAgICAgICAgICAgIGNvbmZpZyk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1NUQVJUX0hFQURFUiwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgZW50aXR5LmFkdmFuY2UoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgICAgIGZhaWwoIk1heExpbmVMaW1pdEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOw0KKyAgICAgICAgfSBjYXRjaCAoTWF4TGluZUxpbWl0RXhjZXB0aW9uIGV4cGVjdGVkKSB7DQorICAgICAgICB9DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhMaW5lTGltaXRDaGVja0ZvbGRlZExpbmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IA0KKyAgICAgICAgICAgICJUbzogUm9hZCBSdW5uZXIgPHJ1bm5lckBleGFtcGxlLm9yZz5cclxuIiArDQorICAgICAgICAgICAgIkZyb206IFdpbGUgRS4gQ2F5b3RlIDx3aWxlQGV4YW1wbGUub3JnPlxyXG4iICsNCisgICAgICAgICAgICAiRGF0ZTogVHVlLCAxMiBGZWIgMjAwOCAxNzozNDowOSArMDAwMCAoR01UKVxyXG4iICsNCisgICAgICAgICAgICAiU3ViamVjdDogTWFpbFxyXG4iICsNCisgICAgICAgICAgICAiRG9TOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIiAgICB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpblxyXG4iICsNCisgICAgICAgICAgICAiXHJcbiIgKw0KKyAgICAgICAgICAgICJhIHZlcnkgaW1wb3J0YW50IG1lc3NhZ2UiOw0KKyAgICAgICAgYnl0ZVtdIHJhdyA9IG1lc3NhZ2UuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIik7DQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXcpOw0KKyAgICAgICAgTGluZU51bWJlcklucHV0U3RyZWFtIGxpbmVJbnB1dCA9IG5ldyBMaW5lTnVtYmVySW5wdXRTdHJlYW0oaW5zdHJlYW0pOyANCisgICAgICAgIEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtIHJhd3N0cmVhbSA9IG5ldyBCdWZmZXJlZExpbmVSZWFkZXJJbnB1dFN0cmVhbShsaW5lSW5wdXQsIDEyKTsgDQorICAgICAgICANCisgICAgICAgIE1pbWVFbnRpdHlDb25maWcgY29uZmlnID0gbmV3IE1pbWVFbnRpdHlDb25maWcoKTsNCisgICAgICAgIGNvbmZpZy5zZXRNYXhMaW5lTGVuKDUwKTsNCisgICAgICAgIE1pbWVFbnRpdHkgZW50aXR5ID0gbmV3IE1pbWVFbnRpdHkoDQorICAgICAgICAgICAgICAgIGxpbmVJbnB1dCwNCisgICAgICAgICAgICAgICAgcmF3c3RyZWFtLA0KKyAgICAgICAgICAgICAgICBudWxsLA0KKyAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFLA0KKyAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9FTkRfTUVTU0FHRSwNCisgICAgICAgICAgICAgICAgY29uZmlnKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1NUQVJUX01FU1NBR0UsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICAgICAgZmFpbCgiTWF4TGluZUxpbWl0RXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7DQorICAgICAgICB9IGNhdGNoIChNYXhMaW5lTGltaXRFeGNlcHRpb24gZXhwZWN0ZWQpIHsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4SGVhZGVyQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gDQorICAgICAgICAgICAgIlRvOiBSb2FkIFJ1bm5lciA8cnVubmVyQGV4YW1wbGUub3JnPlxyXG4iICsNCisgICAgICAgICAgICAiRnJvbTogV2lsZSBFLiBDYXlvdGUgPHdpbGVAZXhhbXBsZS5vcmc+XHJcbiIgKw0KKyAgICAgICAgICAgICJEYXRlOiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpXHJcbiIgKw0KKyAgICAgICAgICAgICJTdWJqZWN0OiBNYWlsXHJcbiIgKw0KKyAgICAgICAgICAgICJEb1M6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eFxyXG4iICsNCisgICAgICAgICAgICAiRG9TOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIkRvUzogeHh4eHh4eHh4eHh4eHh4eHh4eHh4XHJcbiIgKw0KKyAgICAgICAgICAgICJEb1M6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eFxyXG4iICsNCisgICAgICAgICAgICAiRG9TOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIkRvUzogeHh4eHh4eHh4eHh4eHh4eHh4eHh4XHJcbiIgKw0KKyAgICAgICAgICAgICJEb1M6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eFxyXG4iICsNCisgICAgICAgICAgICAiRG9TOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIkRvUzogeHh4eHh4eHh4eHh4eHh4eHh4eHh4XHJcbiIgKw0KKyAgICAgICAgICAgICJEb1M6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eFxyXG4iICsNCisgICAgICAgICAgICAiRG9TOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIkRvUzogeHh4eHh4eHh4eHh4eHh4eHh4eHh4XHJcbiIgKw0KKyAgICAgICAgICAgICJEb1M6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eFxyXG4iICsNCisgICAgICAgICAgICAiRG9TOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHhcclxuIiArDQorICAgICAgICAgICAgIkRvUzogeHh4eHh4eHh4eHh4eHh4eHh4eHh4XHJcbiIgKw0KKyAgICAgICAgICAgICJEb1M6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eFxyXG4iICsNCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIgKw0KKyAgICAgICAgICAgICJcclxuIiArDQorICAgICAgICAgICAgImEgdmVyeSBpbXBvcnRhbnQgbWVzc2FnZSI7DQorICAgICAgICBieXRlW10gcmF3ID0gbWVzc2FnZS5nZXRCeXRlcygiVVMtQVNDSUkiKTsNCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJhdyk7DQorICAgICAgICBMaW5lTnVtYmVySW5wdXRTdHJlYW0gbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJJbnB1dFN0cmVhbShpbnN0cmVhbSk7IA0KKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gcmF3c3RyZWFtID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKGxpbmVJbnB1dCwgMTIpOyANCisgICAgICAgIA0KKyAgICAgICAgTWltZUVudGl0eUNvbmZpZyBjb25maWcgPSBuZXcgTWltZUVudGl0eUNvbmZpZygpOw0KKyAgICAgICAgY29uZmlnLnNldE1heEhlYWRlckNvdW50KDIwKTsNCisgICAgICAgIE1pbWVFbnRpdHkgZW50aXR5ID0gbmV3IE1pbWVFbnRpdHkoDQorICAgICAgICAgICAgICAgIGxpbmVJbnB1dCwNCisgICAgICAgICAgICAgICAgcmF3c3RyZWFtLA0KKyAgICAgICAgICAgICAgICBudWxsLA0KKyAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFLA0KKyAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9FTkRfTUVTU0FHRSwNCisgICAgICAgICAgICAgICAgY29uZmlnKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1NUQVJUX01FU1NBR0UsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICANCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgew0KKyAgICAgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICB9DQorICAgICAgICB0cnkgew0KKyAgICAgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICAgICAgZmFpbCgiTWF4SGVhZGVyTGltaXRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsNCisgICAgICAgIH0gY2F0Y2ggKE1heEhlYWRlckxpbWl0RXhjZXB0aW9uIGV4cGVjdGVkKSB7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdE1heENvbnRlbnRMaW1pdENoZWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IA0KKyAgICAgICAgICAgICJUbzogUm9hZCBSdW5uZXIgPHJ1bm5lckBleGFtcGxlLm9yZz5cclxuIiArDQorICAgICAgICAgICAgIkZyb206IFdpbGUgRS4gQ2F5b3RlIDx3aWxlQGV4YW1wbGUub3JnPlxyXG4iICsNCisgICAgICAgICAgICAiRGF0ZTogVHVlLCAxMiBGZWIgMjAwOCAxNzozNDowOSArMDAwMCAoR01UKVxyXG4iICsNCisgICAgICAgICAgICAiU3ViamVjdDogTWFpbFxyXG4iICsNCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIgKw0KKyAgICAgICAgICAgICJcclxuIiArDQorICAgICAgICAgICAgIkRvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TXHJcbiIgKw0KKyAgICAgICAgICAgICJEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvU1xyXG4iICsNCisgICAgICAgICAgICAiRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1NcclxuIiArDQorICAgICAgICAgICAgIkRvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TXHJcbiIgKw0KKyAgICAgICAgICAgICJEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvU1xyXG4iICsNCisgICAgICAgICAgICAiRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1NcclxuIiArDQorICAgICAgICAgICAgIkRvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TXHJcbiIgKw0KKyAgICAgICAgICAgICJEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvU1xyXG4iICsNCisgICAgICAgICAgICAiRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1NcclxuIiArDQorICAgICAgICAgICAgIkRvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TIERvUyBEb1MgRG9TXHJcbiI7DQorICAgICAgICBieXRlW10gcmF3ID0gbWVzc2FnZS5nZXRCeXRlcygiVVMtQVNDSUkiKTsNCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJhdyk7DQorICAgICAgICBMaW5lTnVtYmVySW5wdXRTdHJlYW0gbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJJbnB1dFN0cmVhbShpbnN0cmVhbSk7IA0KKyAgICAgICAgQnVmZmVyZWRMaW5lUmVhZGVySW5wdXRTdHJlYW0gcmF3c3RyZWFtID0gbmV3IEJ1ZmZlcmVkTGluZVJlYWRlcklucHV0U3RyZWFtKGxpbmVJbnB1dCwgMTIpOyANCisgICAgICAgIA0KKyAgICAgICAgTWltZUVudGl0eUNvbmZpZyBjb25maWcgPSBuZXcgTWltZUVudGl0eUNvbmZpZygpOw0KKyAgICAgICAgY29uZmlnLnNldE1heENvbnRlbnRMZW4oMTAwKTsNCisgICAgICAgIE1pbWVFbnRpdHkgZW50aXR5ID0gbmV3IE1pbWVFbnRpdHkoDQorICAgICAgICAgICAgICAgIGxpbmVJbnB1dCwNCisgICAgICAgICAgICAgICAgcmF3c3RyZWFtLA0KKyAgICAgICAgICAgICAgICBudWxsLA0KKyAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9TVEFSVF9NRVNTQUdFLA0KKyAgICAgICAgICAgICAgICBFbnRpdHlTdGF0ZXMuVF9FTkRfTUVTU0FHRSwNCisgICAgICAgICAgICAgICAgY29uZmlnKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX1NUQVJUX01FU1NBR0UsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSLCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0ZJRUxELCBlbnRpdHkuZ2V0U3RhdGUoKSk7DQorICAgICAgICBlbnRpdHkuYWR2YW5jZSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVN0YXRlcy5UX0VORF9IRUFERVIsIGVudGl0eS5nZXRTdGF0ZSgpKTsNCisgICAgICAgIGVudGl0eS5hZHZhbmNlKCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5U3RhdGVzLlRfQk9EWSwgZW50aXR5LmdldFN0YXRlKCkpOw0KKyAgICAgICAgdHJ5IHsNCisgICAgICAgICAgICBJT1V0aWxzLnRvQnl0ZUFycmF5KGVudGl0eS5nZXRDb250ZW50U3RyZWFtKCkpOw0KKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7DQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgew0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIA0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lU3RyZWFtUGFyc2VyRXhhbXBsZU1lc3NhZ2VzVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVN0cmVhbVBhcnNlckV4YW1wbGVNZXNzYWdlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjg0M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVN0cmVhbVBhcnNlckV4YW1wbGVNZXNzYWdlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZVN0cmVhbVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkJhc2ljQ29uZmlndXJhdG9yOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKKy8qKgorICogQ3JlYXRlcyBhIFRlc3RTdWl0ZSBydW5uaW5nIHRoZSB0ZXN0IGZvciBlYWNoIC5tc2cgZmlsZSBpbiB0aGUgdGVzdCByZXNvdWNlIGZvbGRlci4KKyAqIEFsbG93IHJ1bm5pbmcgb2YgYSBzaW5nbGUgdGVzdCBmcm9tIFVuaXQgdGVzdGluZyBHVUlzCisgKi8KK3B1YmxpYyBjbGFzcyBNaW1lU3RyZWFtUGFyc2VyRXhhbXBsZU1lc3NhZ2VzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgRmlsZSBmaWxlOworCisKKyAgICBwdWJsaWMgTWltZVN0cmVhbVBhcnNlckV4YW1wbGVNZXNzYWdlc1Rlc3QoU3RyaW5nIHRlc3ROYW1lKSB7CisgICAgICAgIHRoaXModGVzdE5hbWUsIE1pbWVTdHJlYW1QYXJzZXJFeGFtcGxlTWVzc2FnZXNUZXN0U3VpdGUuZ2V0RmlsZSh0ZXN0TmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBNaW1lU3RyZWFtUGFyc2VyRXhhbXBsZU1lc3NhZ2VzVGVzdChTdHJpbmcgbmFtZSwgRmlsZSB0ZXN0RmlsZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICAgICAgdGhpcy5maWxlID0gdGVzdEZpbGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLnJlc2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBCYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTsKKyAgICB9CisgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIE1pbWVTdHJlYW1QYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgVGVzdEhhbmRsZXIgaGFuZGxlciA9IG51bGw7CisgICAgICAgIE1pbWVFbnRpdHlDb25maWcgY29uZmlnID0gbmV3IE1pbWVFbnRpdHlDb25maWcoKTsKKyAgICAgICAgY29uZmlnLnNldE1heExpbmVMZW4oLTEpOworICAgICAgICBwYXJzZXIgPSBuZXcgTWltZVN0cmVhbVBhcnNlcihjb25maWcpOworICAgICAgICBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCk7CisgICAgICAgIAorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBhcnNpbmcgIiArIGZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOworICAgICAgICBwYXJzZXIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgICAgIAorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gaGFuZGxlci5zYi50b1N0cmluZygpOworICAgICAgICBTdHJpbmcgeG1sRmlsZSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKDAsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkubGFzdEluZGV4T2YoJy4nKSkgKyAiLnhtbCI7CisgICAgICAgIFN0cmluZyB4bWxGaWxlTWltZTRqID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoMCwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sYXN0SW5kZXhPZignLicpKSArICIubWltZTRqLnhtbCI7CisgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gSU9VdGlscy50b1N0cmluZyhuZXcgRmlsZUlucHV0U3RyZWFtKHhtbEZpbGUpLCAiSVNPODg1OS0xIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkVycm9yIHBhcnNpbmcgIiArIGZpbGUuZ2V0TmFtZSgpLCBleHBlY3RlZCwgcmVzdWx0KTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oeG1sRmlsZU1pbWU0aik7CisgICAgICAgICAgICBmb3Mud3JpdGUocmVzdWx0LmdldEJ5dGVzKCkpOworICAgICAgICAgICAgZm9zLmZsdXNoKCk7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIGZhaWwoIlhNTCBmaWxlIG5vdCBmb3VuZDogZ2VuZXJhdGVkIGEgZmlsZSB3aXRoIHRoZSBleHBlY3RlZCByZXN1bHQhIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IE1pbWVTdHJlYW1QYXJzZXJFeGFtcGxlTWVzc2FnZXNUZXN0U3VpdGUoKTsKKyAgICB9CisKKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgTWltZVN0cmVhbVBhcnNlckV4YW1wbGVNZXNzYWdlc1Rlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSBURVNUU19GT0xERVIgPSBuZXcgRmlsZSgic3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzIik7CisKKyAgICAgICAgcHVibGljIE1pbWVTdHJlYW1QYXJzZXJFeGFtcGxlTWVzc2FnZXNUZXN0U3VpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIEZpbGUgZGlyID0gVEVTVFNfRk9MREVSOworICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IGZpbGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5tc2ciKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRUZXN0KG5ldyBNaW1lU3RyZWFtUGFyc2VyRXhhbXBsZU1lc3NhZ2VzVGVzdChmLmdldE5hbWUoKS5zdWJzdHJpbmcoMCwgZi5nZXROYW1lKCkubGVuZ3RoKCktNCksIGYpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBnZXRGaWxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoVEVTVFNfRk9MREVSLmdldEFic29sdXRlUGF0aCgpK0ZpbGUuc2VwYXJhdG9yK25hbWUrIi5tc2ciKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVN0cmVhbVBhcnNlclRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVTdHJlYW1QYXJzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjZDRhMgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVTdHJlYW1QYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0NzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKg0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKg0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqDQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKg0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKg0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqDQorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsNCisNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvci5Cb2R5RGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkFic3RyYWN0Q29udGVudEhhbmRsZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5NaW1lU3RyZWFtUGFyc2VyOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkJ5dGVTZXF1ZW5jZTsNCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbC5Db250ZW50VXRpbDsNCitpbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5CYXNpY0NvbmZpZ3VyYXRvcjsNCisNCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgTWltZVN0cmVhbVBhcnNlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7DQorDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsNCisgICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLnJlc2V0Q29uZmlndXJhdGlvbigpOw0KKyAgICAgICAgQmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7DQorICAgIH0NCisgICAgICAgIC8qDQorICAgIHB1YmxpYyB2b2lkIHRlc3RSb290QW5kQm9keVN0cmVhbXNBcmVTeW5jaGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoInRlc3Rtc2dzIik7DQorICAgICAgICBGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7DQorICAgICAgICANCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsNCisgICAgICAgICAgICBGaWxlIGYgPSBmaWxlc1tpXTsNCisgICAgICAgICAgICANCisgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLm1zZyIpKSB7DQorICAgICAgICAgICAgICAgIGZpbmFsIFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGYsICJyIik7DQorICAgICAgICAgICAgICAgIGZpbmFsIEVPTFRyYWNraW5nSW5wdXRTdHJlYW0gcm9vdFN0cmVhbSA9IA0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEVPTFRyYWNraW5nSW5wdXRTdHJlYW0oDQorICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmFuZG9tQWNjZXNzRmlsZUlucHV0U3RyZWFtKGZpbGUsIDAsIGZpbGUubGVuZ3RoKCkpKTsNCisgICAgICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgQWJzdHJhY3RDb250ZW50SGFuZGxlcigpIHsNCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJvZHkoQm9keURlc2NyaXB0b3IgYmQsIElucHV0U3RyZWFtIGV4cGVjdGVkKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IHJvb3RTdHJlYW0uZ2V0TWFyaygpOw0KKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgUm9vdElucHV0U3RyZWFtKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zKys7DQorICAgICAgICAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBhY3R1YWwgPSANCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRU9MQ29udmVydGluZ0lucHV0U3RyZWFtKA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5kb21BY2Nlc3NGaWxlSW5wdXRTdHJlYW0oZmlsZSwgcG9zLCBmaWxlLmxlbmd0aCgpKSk7DQorICAgICAgICAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IxID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gMDsNCisgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYiA9IGV4cGVjdGVkLnJlYWQoKSkgIT0gLTEpIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYjEuYXBwZW5kKChjaGFyKSAoYiAmIDB4ZmYpKTsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYjIuYXBwZW5kKChjaGFyKSAoYWN0dWFsLnJlYWQoKSAmIDB4ZmYpKTsNCisgICAgICAgICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzYjEudG9TdHJpbmcoKSwgc2IyLnRvU3RyaW5nKCkpOw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICB9Ow0KKyAgICAgICAgICAgICAgICANCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0aW5nIHN5bmNoIG9mICIgKyBmLmdldE5hbWUoKSk7DQorICAgICAgICAgICAgICAgIA0KKyAgICAgICAgICAgICAgICBNaW1lU3RyZWFtUGFyc2VyIHBhcnNlciA9IG5ldyBNaW1lU3RyZWFtUGFyc2VyKCk7DQorICAgICAgICAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsNCisgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlKHJvb3RTdHJlYW0pOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgfSovDQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm91bmRhcnlJbkVwaWxvZ3VlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIHNiLmFwcGVuZCgiRnJvbTogZm9vQGJhci5jb21cclxuIik7DQorICAgICAgICBzYi5hcHBlbmQoIlRvOiBzb21lb25lQGVsc2UuY29tXHJcbiIpOw0KKyAgICAgICAgc2IuYXBwZW5kKCJDb250ZW50LXR5cGU6IG11bHRpcGFydC9zb21ldGhpbmc7IGJvdW5kYXJ5PW15Ym91bmRhcnlcclxuIik7DQorICAgICAgICBzYi5hcHBlbmQoIlxyXG4iKTsNCisgICAgICAgIHNiLmFwcGVuZCgiVGhpcyBpcyB0aGUgcHJlYW1ibGUuXHJcbiIpOw0KKyAgICAgICAgc2IuYXBwZW5kKCItLW15Ym91bmRhcnlcclxuIik7DQorICAgICAgICBzYi5hcHBlbmQoIkNvbnRlbnQtdHlwZTogdGV4dC9wbGFpblxyXG4iKTsNCisgICAgICAgIHNiLmFwcGVuZCgiXHJcbiIpOw0KKyAgICAgICAgc2IuYXBwZW5kKCJUaGlzIGlzIHRoZSBmaXJzdCBib2R5LlxyXG4iKTsNCisgICAgICAgIHNiLmFwcGVuZCgiSXQncyBjb21wbGV0ZWx5IG1lYW5pbmdsZXNzLlxyXG4iKTsNCisgICAgICAgIHNiLmFwcGVuZCgiQWZ0ZXIgdGhpcyBsaW5lIHRoZSBib2R5IGVuZHMuXHJcbiIpOw0KKyAgICAgICAgc2IuYXBwZW5kKCJcclxuIik7DQorICAgICAgICBzYi5hcHBlbmQoIi0tbXlib3VuZGFyeS0tXHJcbiIpOw0KKyAgICAgICAgDQorICAgICAgICBTdHJpbmdCdWlsZGVyIGVwaWxvZ3VlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGVwaWxvZ3VlLmFwcGVuZCgiQ29udGVudC10eXBlOiB0ZXh0L3BsYWluXHJcbiIpOw0KKyAgICAgICAgZXBpbG9ndWUuYXBwZW5kKCJcclxuIik7DQorICAgICAgICBlcGlsb2d1ZS5hcHBlbmQoIlRoaXMgaXMgYWN0dWFsbHkgdGhlIGVwaWxvZ3VlIGJ1dCBpdCBsb29rcyBsaWtlIGEgc2Vjb25kIGJvZHkuXHJcbiIpOw0KKyAgICAgICAgZXBpbG9ndWUuYXBwZW5kKCJZYWRhIHlhZGEgeWFkYS5cclxuIik7DQorICAgICAgICBlcGlsb2d1ZS5hcHBlbmQoIlxyXG4iKTsNCisgICAgICAgIGVwaWxvZ3VlLmFwcGVuZCgiLS1teWJvdW5kYXJ5LS1cclxuIik7DQorICAgICAgICBlcGlsb2d1ZS5hcHBlbmQoIlRoaXMgaXMgc3RpbGwgdGhlIGVwaWxvZ3VlLlxyXG4iKTsNCisgICAgICAgIA0KKyAgICAgICAgc2IuYXBwZW5kKGVwaWxvZ3VlLnRvU3RyaW5nKCkpOw0KKyAgICAgICAgDQorICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVTLUFTQ0lJIikpOw0KKyAgICAgICAgDQorICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGFjdHVhbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorICAgICAgICANCisgICAgICAgIE1pbWVTdHJlYW1QYXJzZXIgcGFyc2VyID0gbmV3IE1pbWVTdHJlYW1QYXJzZXIoKTsNCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihuZXcgQWJzdHJhY3RDb250ZW50SGFuZGxlcigpIHsNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlcGlsb2d1ZShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsNCisgICAgICAgICAgICAgICAgaW50IGI7DQorICAgICAgICAgICAgICAgIHdoaWxlICgoYiA9IGlzLnJlYWQoKSkgIT0gLTEpIHsNCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbC5hcHBlbmQoKGNoYXIpIGIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSk7DQorICAgICAgICBwYXJzZXIucGFyc2UoYmFpcyk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscyhlcGlsb2d1ZS50b1N0cmluZygpLCBhY3R1YWwudG9TdHJpbmcoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU9uZUxpbmVGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KKyAgICAgICAgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOw0KKyAgICAgICAgZXhwZWN0ZWQuYWRkKCJGcm9tOiBmb29AYWJyLmNvbSIpOw0KKyAgICAgICAgc2IuYXBwZW5kKGV4cGVjdGVkLmdldExhc3QoKSArICJcclxuIik7DQorICAgICAgICBleHBlY3RlZC5hZGQoIlN1YmplY3Q6IEEgc3ViamVjdCIpOw0KKyAgICAgICAgc2IuYXBwZW5kKGV4cGVjdGVkLmdldExhc3QoKSArICJcclxuIik7DQorICAgICAgICANCisgICAgICAgIE1pbWVTdHJlYW1QYXJzZXIgcGFyc2VyID0gbmV3IE1pbWVTdHJlYW1QYXJzZXIoKTsNCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihuZXcgQWJzdHJhY3RDb250ZW50SGFuZGxlcigpIHsNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWVsZChGaWVsZCBmaWVsZCkgew0KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQucmVtb3ZlRmlyc3QoKSwgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSk7DQorICAgICAgICANCisgICAgICAgIHBhcnNlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKSk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscygwLCBleHBlY3RlZC5zaXplKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q1JXaXRob3V0TEZJbkhlYWRlcigpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgLyoNCisgICAgICAgICAqIFRlc3QgYWRkZWQgYmVjYXVzZSBccjpzIG5vdCBmb2xsb3dlZCBieSBcbjpzIGluIHRoZSBoZWFkZXIgd291bGQNCisgICAgICAgICAqIGNhdXNlIGFuIGluZmluaXRlIGxvb3AuIA0KKyAgICAgICAgICovDQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgiVGhlLWZpZWxkOiBUaGlzIGZpZWxkXHJccmNvbnRhaW5zIENSOnNcclxyIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdFxyXG5cdGZvbGxvd2VkIGJ5IExGIik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpICsgIlxyXG4iKTsNCisgICAgICAgIA0KKyAgICAgICAgTWltZVN0cmVhbVBhcnNlciBwYXJzZXIgPSBuZXcgTWltZVN0cmVhbVBhcnNlcigpOw0KKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBBYnN0cmFjdENvbnRlbnRIYW5kbGVyKCkgew0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpZWxkKEZpZWxkIGZpZWxkKSB7DQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5yZW1vdmVGaXJzdCgpLCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9KTsNCisgICAgICAgIA0KKyAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGV4cGVjdGVkLnNpemUoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU11bHRpTGluZUZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7DQorICAgICAgICBleHBlY3RlZC5hZGQoIlJlY2VpdmVkOiBieSBuZXRtYngubmV0bWJ4LmRlICgvXFw9PS9cXCBTbWFpbDMuMS4yOC4xKVxyXG4iDQorICAgICAgICAgICAgICAgICAgICsgIlx0ZnJvbSBtYWlsLmNzLnR1LWJlcmxpbi5kZSB3aXRoIHNtdHBcclxuIg0KKyAgICAgICAgICAgICAgICAgICArICJcdGlkICZsdDttMHVXUHJPLTAwMDR3cEMmZ3Q7OyINCisgICAgICAgICAgICAgICAgICAgICAgICArICIgV2VkLCAxOSBKdW4gOTYgMTg6MTIgTUVTIik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpICsgIlxyXG4iKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgiU3ViamVjdDogQSBmb2xkZWQgc3ViamVjdFxyXG4gTGluZSAyXHJcblx0TGluZSAzIik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpICsgIlxyXG4iKTsNCisgICAgICAgIA0KKyAgICAgICAgTWltZVN0cmVhbVBhcnNlciBwYXJzZXIgPSBuZXcgTWltZVN0cmVhbVBhcnNlcigpOw0KKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBBYnN0cmFjdENvbnRlbnRIYW5kbGVyKCkgew0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpZWxkKEZpZWxkIGZpZWxkKSB7DQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5yZW1vdmVGaXJzdCgpLCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9KTsNCisgICAgICAgIA0KKyAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGV4cGVjdGVkLnNpemUoKSk7DQorICAgIH0NCisgICAgDQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBmaW5hbCBNaW1lU3RyZWFtUGFyc2VyIHBhcnNlciA9IG5ldyBNaW1lU3RyZWFtUGFyc2VyKCk7DQorICAgICAgICBUZXN0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RIYW5kbGVyKCkgew0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVuZEhlYWRlcigpIHsNCisgICAgICAgICAgICAgICAgc3VwZXIuZW5kSGVhZGVyKCk7DQorICAgICAgICAgICAgICAgIHBhcnNlci5zdG9wKCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfTsNCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsNCisNCisgICAgICAgIFN0cmluZyBtc2cgPSAiU3ViamVjdDogWWFkYSB5YWRhXHJcbiINCisgICAgICAgICAgICAgICAgICAgKyAiRnJvbTogZm9vQGJhci5jb21cclxuIg0KKyAgICAgICAgICAgICAgICAgICArICJcclxuIg0KKyAgICAgICAgICAgICAgICAgICArICJMaW5lIDFcclxuIg0KKyAgICAgICAgICAgICAgICAgICArICJMaW5lIDJcclxuIjsNCisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICI8bWVzc2FnZT5cclxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxoZWFkZXI+XHJcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8ZmllbGQ+XHJcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICJTdWJqZWN0OiBZYWRhIHlhZGEiDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9maWVsZD5cclxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxmaWVsZD5cclxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkZyb206IGZvb0BiYXIuY29tIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvZmllbGQ+XHJcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8L2hlYWRlcj5cclxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxib2R5PlxyXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9ib2R5PlxyXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9tZXNzYWdlPlxyXG4iOw0KKyAgICAgICAgDQorICAgICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1zZy5nZXRCeXRlcygpKSk7DQorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gaGFuZGxlci5zYi50b1N0cmluZygpOw0KKyAgICAgICAgDQorICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCk7DQorICAgIH0NCisgICAgDQorICAgIC8qDQorICAgICAqIFRlc3RzIHRoYXQgaW52YWxpZCBmaWVsZHMgYXJlIGlnbm9yZWQuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7DQorICAgICAgICBzYi5hcHBlbmQoIkZyb20gLSBmb29AYWJyLmNvbVxyXG4iKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgiRnJvbTogc29tZUBvbmUuY29tIik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpICsgIlxyXG4iKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgiU3ViamVjdDogQSBzdWJqZWN0Iik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpICsgIlxyXG4iKTsNCisgICAgICAgIHNiLmFwcGVuZCgiQSBsaW5lIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkXHJcbiIpOw0KKyAgICAgICAgDQorICAgICAgICBNaW1lU3RyZWFtUGFyc2VyIHBhcnNlciA9IG5ldyBNaW1lU3RyZWFtUGFyc2VyKCk7DQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEFic3RyYWN0Q29udGVudEhhbmRsZXIoKSB7DQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmllbGQoRmllbGQgZmllbGQpIHsNCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnJlbW92ZUZpcnN0KCksIGRlY29kZShmaWVsZC5nZXRSYXcoKSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0pOw0KKyAgICAgICAgDQorICAgICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSkpOw0KKyAgICAgICAgDQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZXhwZWN0ZWQuc2l6ZSgpKTsNCisgICAgfQ0KKw0KKyAgICAvKg0KKyAgICAgKiBUZXN0cyB0aGF0IGVtcHR5IHN0cmVhbXMgc3RpbGwgZ2VuZXJhdGUgdGhlIGV4cGVjdGVkIHNlcmllcyBvZiBldmVudHMuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgic3RhcnRNZXNzYWdlIik7DQorICAgICAgICBleHBlY3RlZC5hZGQoInN0YXJ0SGVhZGVyIik7DQorICAgICAgICBleHBlY3RlZC5hZGQoImVuZEhlYWRlciIpOw0KKyAgICAgICAgZXhwZWN0ZWQuYWRkKCJib2R5Iik7DQorICAgICAgICBleHBlY3RlZC5hZGQoImVuZE1lc3NhZ2UiKTsNCisgICAgICAgIA0KKyAgICAgICAgTWltZVN0cmVhbVBhcnNlciBwYXJzZXIgPSBuZXcgTWltZVN0cmVhbVBhcnNlcigpOw0KKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBBYnN0cmFjdENvbnRlbnRIYW5kbGVyKCkgew0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJvZHkoQm9keURlc2NyaXB0b3IgYmQsIElucHV0U3RyZWFtIGlzKSB7DQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5yZW1vdmVGaXJzdCgpLCAiYm9keSIpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICANCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbmRNdWx0aXBhcnQoKSB7DQorICAgICAgICAgICAgICAgIGZhaWwoImVuZE11bHRpcGFydCBzaG91bGRuJ3QgYmUgY2FsbGVkIGZvciBlbXB0eSBzdHJlYW0iKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kQm9keVBhcnQoKSB7DQorICAgICAgICAgICAgICAgIGZhaWwoImVuZEJvZHlQYXJ0IHNob3VsZG4ndCBiZSBjYWxsZWQgZm9yIGVtcHR5IHN0cmVhbSIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbmRIZWFkZXIoKSB7DQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5yZW1vdmVGaXJzdCgpLCAiZW5kSGVhZGVyIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVuZE1lc3NhZ2UoKSB7DQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5yZW1vdmVGaXJzdCgpLCAiZW5kTWVzc2FnZSIpOw0KKyAgICAgICAgICAgIH0NCisNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWVsZChGaWVsZCBmaWVsZCkgew0KKyAgICAgICAgICAgICAgICBmYWlsKCJmaWVsZCBzaG91bGRuJ3QgYmUgY2FsbGVkIGZvciBlbXB0eSBzdHJlYW0iKTsNCisgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRNdWx0aXBhcnQoQm9keURlc2NyaXB0b3IgYmQpIHsNCisgICAgICAgICAgICAgICAgZmFpbCgic3RhcnRNdWx0aXBhcnQgc2hvdWxkbid0IGJlIGNhbGxlZCBmb3IgZW1wdHkgc3RyZWFtIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0Qm9keVBhcnQoKSB7DQorICAgICAgICAgICAgICAgIGZhaWwoInN0YXJ0Qm9keVBhcnQgc2hvdWxkbid0IGJlIGNhbGxlZCBmb3IgZW1wdHkgc3RyZWFtIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0SGVhZGVyKCkgew0KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQucmVtb3ZlRmlyc3QoKSwgInN0YXJ0SGVhZGVyIik7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0TWVzc2FnZSgpIHsNCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnJlbW92ZUZpcnN0KCksICJzdGFydE1lc3NhZ2UiKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9KTsNCisgICAgICAgIA0KKyAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOw0KKyAgICAgICAgDQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZXhwZWN0ZWQuc2l6ZSgpKTsNCisgICAgfQ0KKyAgICANCisgICAgLyoNCisgICAgICogVGVzdHMgcGFyc2luZyBvZiBlbXB0eSBoZWFkZXJzLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdEVtcHlIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOw0KKyAgICAgICAgc2IuYXBwZW5kKCJcclxuIik7DQorICAgICAgICBzYi5hcHBlbmQoIlRoZSBib2R5IGlzIHJpZ2h0IGhlcmVcclxuIik7DQorICAgICAgICANCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYm9keSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7DQorICAgICAgICANCisgICAgICAgIE1pbWVTdHJlYW1QYXJzZXIgcGFyc2VyID0gbmV3IE1pbWVTdHJlYW1QYXJzZXIoKTsNCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihuZXcgQWJzdHJhY3RDb250ZW50SGFuZGxlcigpIHsNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWVsZChGaWVsZCBmaWVsZCkgew0KKyAgICAgICAgICAgICAgICBmYWlsKCJObyBmaWVsZHMgc2hvdWxkIGJlIHJlcG9ydGVkIik7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJvZHkoQm9keURlc2NyaXB0b3IgYmQsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgICAgICAgICBpbnQgYjsNCisgICAgICAgICAgICAgICAgd2hpbGUgKChiID0gaXMucmVhZCgpKSAhPSAtMSkgew0KKyAgICAgICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoKGNoYXIpIGIpOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSk7DQorICAgICAgICANCisgICAgICAgIHBhcnNlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKSk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIGJvZHkgaXMgcmlnaHQgaGVyZVxyXG4iLCBib2R5LnRvU3RyaW5nKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKg0KKyAgICAgKiBUZXN0cyBwYXJzaW5nIG9mIGVtcHR5IGJvZHkuDQorICAgICAqLw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgiRnJvbTogc29tZUBvbmUuY29tIik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpICsgIlxyXG4iKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgiU3ViamVjdDogQSBzdWJqZWN0Iik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpICsgIlxyXG5cclxuIik7DQorICAgICAgICANCisgICAgICAgIE1pbWVTdHJlYW1QYXJzZXIgcGFyc2VyID0gbmV3IE1pbWVTdHJlYW1QYXJzZXIoKTsNCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihuZXcgQWJzdHJhY3RDb250ZW50SGFuZGxlcigpIHsNCisgICAgICAgICAgICBAT3ZlcnJpZGUNCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWVsZChGaWVsZCBmaWVsZCkgew0KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQucmVtb3ZlRmlyc3QoKSwgZGVjb2RlKGZpZWxkLmdldFJhdygpKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJvZHkoQm9keURlc2NyaXB0b3IgYmQsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGlzLnJlYWQoKSk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfSk7DQorICAgICAgICANCisgICAgICAgIHBhcnNlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKSk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscygwLCBleHBlY3RlZC5zaXplKCkpOw0KKyAgICB9DQorICAgIA0KKyAgICAvKg0KKyAgICAgKiBUZXN0cyB0aGF0IGludmFsaWQgZmllbGRzIGFyZSBpZ25vcmVkLg0KKyAgICAgKi8NCisgICAgcHVibGljIHZvaWQgdGVzdFByZW1hdHVyZUVPRkFmdGVyRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQorICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgiRnJvbTogc29tZUBvbmUuY29tIik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpICsgIlxyXG4iKTsNCisgICAgICAgIGV4cGVjdGVkLmFkZCgiU3ViamVjdDogQSBzdWJqZWN0Iik7DQorICAgICAgICBzYi5hcHBlbmQoZXhwZWN0ZWQuZ2V0TGFzdCgpKTsNCisgICAgICAgIA0KKyAgICAgICAgTWltZVN0cmVhbVBhcnNlciBwYXJzZXIgPSBuZXcgTWltZVN0cmVhbVBhcnNlcigpOw0KKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBBYnN0cmFjdENvbnRlbnRIYW5kbGVyKCkgew0KKyAgICAgICAgICAgIEBPdmVycmlkZQ0KKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpZWxkKEZpZWxkIGZpZWxkKSB7DQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5yZW1vdmVGaXJzdCgpLCBkZWNvZGUoZmllbGQuZ2V0UmF3KCkpKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9KTsNCisgICAgICAgIA0KKyAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpKTsNCisgICAgICAgIA0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGV4cGVjdGVkLnNpemUoKSk7DQorICAgICAgICANCisgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsNCisgICAgICAgIGV4cGVjdGVkLmNsZWFyKCk7DQorICAgICAgICBleHBlY3RlZC5hZGQoIkZyb206IHNvbWVAb25lLmNvbSIpOw0KKyAgICAgICAgc2IuYXBwZW5kKGV4cGVjdGVkLmdldExhc3QoKSArICJcclxuIik7DQorICAgICAgICBleHBlY3RlZC5hZGQoIlN1YmplY3Q6IEEgc3ViamVjdCIpOw0KKyAgICAgICAgc2IuYXBwZW5kKGV4cGVjdGVkLmdldExhc3QoKSArICJcclxuIik7DQorICAgICAgICANCisgICAgICAgIHBhcnNlciA9IG5ldyBNaW1lU3RyZWFtUGFyc2VyKCk7DQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IEFic3RyYWN0Q29udGVudEhhbmRsZXIoKSB7DQorICAgICAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmllbGQoRmllbGQgZmllbGQpIHsNCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnJlbW92ZUZpcnN0KCksIGRlY29kZShmaWVsZC5nZXRSYXcoKSkpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0pOw0KKyAgICAgICAgDQorICAgICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSkpOw0KKyAgICAgICAgDQorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZXhwZWN0ZWQuc2l6ZSgpKTsNCisgICAgfQ0KKyAgICANCisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9tYXRpY0NvbnRlbnREZWNvZGluZygpIHRocm93cyBFeGNlcHRpb24gew0KKyAgICAgICAgTWltZVN0cmVhbVBhcnNlciBwYXJzZXIgPSBuZXcgTWltZVN0cmVhbVBhcnNlcigpOw0KKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnREZWNvZGluZyh0cnVlKTsNCisgICAgICAgIFRlc3RIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsNCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsNCisNCisgICAgICAgIFN0cmluZyBtc2cgPSAiU3ViamVjdDogWWFkYSB5YWRhXHJcbiINCisgICAgICAgICAgICAgICAgICAgKyAiRnJvbTogZm9vQGJhci5jb21cclxuIg0KKyAgICAgICAgICAgICAgICAgICArICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVxyXG4iDQorICAgICAgICAgICAgICAgICAgICsgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxyXG4iDQorICAgICAgICAgICAgICAgICAgICsgIlxyXG4iDQorICAgICAgICAgICAgICAgICAgICsgIlYyaHZJR0YwWlNCdGVTQmpZV3RsUHdvPSI7DQorICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiPG1lc3NhZ2U+XHJcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8aGVhZGVyPlxyXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGZpZWxkPlxyXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiU3ViamVjdDogWWFkYSB5YWRhIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvZmllbGQ+XHJcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8ZmllbGQ+XHJcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICJGcm9tOiBmb29AYmFyLmNvbSINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8L2ZpZWxkPlxyXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGZpZWxkPlxyXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9maWVsZD5cclxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxmaWVsZD5cclxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NCINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8L2ZpZWxkPlxyXG4iDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9oZWFkZXI+XHJcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8Ym9keT5cclxuIg0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIldobyBhdGUgbXkgY2FrZT9cbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8L2JvZHk+XHJcbiINCisgICAgICAgICAgICAgICAgICAgICAgICArICI8L21lc3NhZ2U+XHJcbiI7DQorICAgICAgICANCisgICAgICAgIHBhcnNlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obXNnLmdldEJ5dGVzKCkpKTsNCisgICAgICAgIFN0cmluZyByZXN1bHQgPSBoYW5kbGVyLnNiLnRvU3RyaW5nKCk7DQorICAgICAgICANCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzdWx0KTsNCisgICAgfQ0KKyAgICANCisgICAgcHJvdGVjdGVkIFN0cmluZyBkZWNvZGUoQnl0ZVNlcXVlbmNlIGJ5dGVTZXF1ZW5jZSkgew0KKyAgICAgICAgcmV0dXJuIENvbnRlbnRVdGlsLmRlY29kZShieXRlU2VxdWVuY2UpOw0KKyAgICB9DQorICAgIA0KK30NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lU3RyZWFtVG9rZW5NZXNzYWdlUmZjODIyVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVN0cmVhbVRva2VuTWVzc2FnZVJmYzgyMlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzgzNzVlCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVN0cmVhbVRva2VuTWVzc2FnZVJmYzgyMlRlc3QuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5FeGFtcGxlTWFpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZVRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5SZWN1cnNpb25Nb2RlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIE1pbWVTdHJlYW1Ub2tlbk1lc3NhZ2VSZmM4MjJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgTWltZVRva2VuU3RyZWFtIHN0cmVhbTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBzdHJlYW0gPSBuZXcgTWltZVRva2VuU3RyZWFtKCk7CisgICAgICAgIHN0cmVhbS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oRXhhbXBsZU1haWwuTUlNRV9SRkM4MjJfU0lNUExFX0JZVEVTKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFBhcnNlTWVzc2FnZVJGQzgyMkNvcnJlY3RXaXRoRGVmYXVsdENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01FU1NBR0UpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfT0ZfU1RSRUFNKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFBhcnNlTWVzc2FnZVJGQzgyMkNvcnJlY3RXaXRoTm9SZWN1cnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cmVhbS5zZXRSZWN1cnNpb25Nb2RlKFJlY3Vyc2lvbk1vZGUuTV9OT19SRUNVUlNFKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX01FU1NBR0UpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX09GX1NUUkVBTSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRQYXJzZU1lc3NhZ2VSRkM4MjJDb3JyZWN0V2l0aEZsYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLnNldFJlY3Vyc2lvbk1vZGUoUmVjdXJzaW9uTW9kZS5NX0ZMQVQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfT0ZfU1RSRUFNKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIG5leHRJcyhpbnQgc3RhdGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoc3RhdGUpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhzdHJlYW0ubmV4dCgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVRva2VuRW1iZWRkZWRNZXNzYWdlVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVRva2VuRW1iZWRkZWRNZXNzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2I2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lVG9rZW5FbWJlZGRlZE1lc3NhZ2VUZXN0LmphdmEKQEAgLTAsMCArMSwyMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouRXhhbXBsZU1haWw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLk1pbWVUb2tlblN0cmVhbTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIE1pbWVUb2tlbkVtYmVkZGVkTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgTWltZVRva2VuU3RyZWFtIHN0cmVhbTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBzdHJlYW0gPSBuZXcgTWltZVRva2VuU3RyZWFtKCk7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKEV4YW1wbGVNYWlsLk1JTUVfTVVMVElQQVJUX0VNQkVEREVEX01FU1NBR0VTX0JZVEVTKTsKKyAgICAgICAgc3RyZWFtLnBhcnNlKGluKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaGVuUmVjdXJzZVNob3VsZFZpc2l0SW5uZXJNYWlsc0FuZElubmVyTXVsdGlwYXJ0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdHJlYW0uc2V0UmVjdXJzaW9uTW9kZShNaW1lVG9rZW5TdHJlYW0uTV9SRUNVUlNFKTsKKworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICAKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIAorICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfUFJFQU1CTEUpOworCisgICAgICAgIC8vIFBBUlQgT05FCisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgY2hlY2tJbnB1dFN0cmVhbSgiUmh1YmFyYiFcclxuIik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICAKKyAgICAgICAgLy8gUEFSVCBUV08KKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0JPRFlQQVJUKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpOworICAgICAgICBjaGVja0lucHV0U3RyZWFtKCI5ODc2NTQzMjFBSFBMQVxyXG4iKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgIAorICAgICAgICAvLyBQQVJUIFRIUkVFCisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9NRVNTQUdFKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9QUkVBTUJMRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgY2hlY2tJbnB1dFN0cmVhbSgiQ3VzdGFyZCFcclxuIik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0oIkNVU1RBUkRDVVNUQVJEQ1VTVEFSRFxyXG4iKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FUElMT0dVRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTVVMVElQQVJUKTsgICAKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9NRVNTQUdFKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgIAorICAgICAgICAvLyBQQVJUIEZPVVIKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0JPRFlQQVJUKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0oRXhhbXBsZU1haWwuTUlNRV9NVUxUSVBBUlRfRU1CRURERURfTUVTU0FHRVNfSU5ORVJfTVVMVElQQVJUX01JWEVEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9NVUxUSVBBUlQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VQSUxPR1VFKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9NVUxUSVBBUlQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX01FU1NBR0UpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX09GX1NUUkVBTSk7CisgICAgfQorICAgIAorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGVuRmxhdEF0U3RhcnRTaG91bGRJZ25vcmVNdWx0aXBhcnRTdHJ1Y3R1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLnNldFJlY3Vyc2lvbk1vZGUoTWltZVRva2VuU3RyZWFtLk1fRkxBVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIAorICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIAorICAgICAgICBjaGVja0lucHV0U3RyZWFtKEV4YW1wbGVNYWlsLk1JTUVfTVVMVElQQVJUX0VNQkVEREVEX01FU1NBR0VTX0JPRFkpOworICAgICAgICAKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9NRVNTQUdFKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFdoZW5GbGF0U2hvdWxkSWdub3JlSW5uZXJNYWlsc0FuZElubmVyTXVsdGlwYXJ0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICAKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIAorICAgICAgICBzdHJlYW0uc2V0UmVjdXJzaW9uTW9kZShNaW1lVG9rZW5TdHJlYW0uTV9GTEFUKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKTsKKworICAgICAgICAvLyBQQVJUIE9ORQorICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0oIlJodWJhcmIhXHJcbiIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgCisgICAgICAgIC8vIFBBUlQgVFdPCisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgY2hlY2tJbnB1dFN0cmVhbSgiOTg3NjU0MzIxQUhQTEFcclxuIik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICAKKyAgICAgICAgLy8gUEFSVCBUSFJFRQorICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0oRXhhbXBsZU1haWwuTUlNRV9NVUxUSVBBUlRfRU1CRURERURfTUVTU0FHRVNfSU5ORVJfTUFJTCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICAKKyAgICAgICAgLy8gUEFSVCBGT1VSCisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgY2hlY2tJbnB1dFN0cmVhbShFeGFtcGxlTWFpbC5NSU1FX01VTFRJUEFSVF9FTUJFRERFRF9NRVNTQUdFU19JTk5FUl9NVUxUSVBBUlRfTUlYRUQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VQSUxPR1VFKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9NVUxUSVBBUlQpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tJbnB1dFN0cmVhbShTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHN0cmVhbS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBpbnQgbmV4dCA9IGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgaW50IGk9MDsKKyAgICAgICAgd2hpbGUgKG5leHQgIT0gLTEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQCIgKyBpLCBleHBlY3RlZC5jaGFyQXQoaSsrKSwgKGNoYXIpIG5leHQpOworICAgICAgICAgICAgbmV4dCA9IGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoKCksIGkpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgbmV4dElzKGludCBzdGF0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhzdGF0ZSksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHN0cmVhbS5uZXh0KCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lVG9rZW5Ob1JlY3Vyc2VUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lVG9rZW5Ob1JlY3Vyc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4ZmY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVUb2tlbk5vUmVjdXJzZVRlc3QuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNoYXJzZXRVdGlsOworCitwdWJsaWMgY2xhc3MgTWltZVRva2VuTm9SZWN1cnNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUl9NQUlMID0gIkZyb206IFRpbW90aHkgVGF5bGVyIDx0aW1AZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICAgICAgICAgICAgICJUbzogSm9zaHVhIFRldGxleSA8am9zaHVhQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICAgICAiRGF0ZTogVHVlLCAxMiBGZWIgMjAwOCAxNzozNDowOSArMDAwMCAoR01UKVxyXG4iICsKKyAgICAgICAgICAgICAgICAiU3ViamVjdDogTXVsdGlwYXJ0IFdpdGhvdXQgUkZDODIyIFBhcnRcclxuIiArCisgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PTQyXHJcblxyXG4iICsKKyAgICAgICAgICAgICAgICAiLS00MlxyXG4iICsKKyAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOnRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuXHJcbiIgKworICAgICAgICAgICAgICAgICJGaXJzdCBwYXJ0IG9mIHRoaXMgbWFpbFxyXG4iICsKKyAgICAgICAgICAgICAgICAiLS00MlxyXG4iICsKKyAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOnRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuXHJcbiIgKworICAgICAgICAgICAgICAgICJTZWNvbmQgcGFydCBvZiB0aGlzIG1haWxcclxuIiArCisgICAgICAgICAgICAgICAgIi0tNDItLVxyXG4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BSUxfV0lUSF9SRkM4MjJfUEFSVCA9ICJNSU1FLVZlcnNpb246IDEuMFxyXG4iICsKKyAgICAgICAgICAgICJGcm9tOiBUaW1vdGh5IFRheWxlciA8dGltQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICJUbzogSm9zaHVhIFRldGxleSA8am9zaHVhQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICJEYXRlOiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpXHJcbiIgKworICAgICAgICAgICAgIlN1YmplY3Q6IE11bHRpcGFydCBXaXRoIFJGQzgyMiBQYXJ0XHJcbiIgKworICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PTE3MjlcclxuXHJcbiIgKworICAgICAgICAgICAgIkEgc2hvcnQgcHJlbWFibGVcclxuIiArCisgICAgICAgICAgICAiLS0xNzI5XHJcblxyXG4iICsKKyAgICAgICAgICAgICJGaXJzdCBwYXJ0IGhhcyBubyBoZWFkZXJzXHJcbiIgKworICAgICAgICAgICAgIi0tMTcyOVxyXG4iICsKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVMtQVNDSUlcclxuXHJcbiIgKworICAgICAgICAgICAgIlNlY29uZCBwYXJ0IGlzIHBsYWluIHRleHRcclxuIiArCisgICAgICAgICAgICAiLS0xNzI5XHJcbiIgKworICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjJcclxuXHJcbiIgKworICAgICAgICAgICAgSU5ORVJfTUFJTCArCisgICAgICAgICAgICAiLS0xNzI5XHJcbiIgKworICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG5cclxuIiArCisgICAgICAgICAgICAiTGFzdCBwYXJ0IGlzIHBsYWluIHRleHRcclxuIiArCisgICAgICAgICAgICAiLS0xNzI5LS1cclxuIiArCisgICAgICAgICAgICAiVGhlIEVuZCI7CisgICAgCisgICAgTWltZVRva2VuU3RyZWFtIHN0cmVhbTsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBzdHJlYW0gPSBuZXcgTWltZVRva2VuU3RyZWFtKCk7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IENoYXJzZXRVdGlsLlVTX0FTQ0lJLmVuY29kZShNQUlMX1dJVEhfUkZDODIyX1BBUlQpLmFycmF5KCk7CisgICAgICAgIElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKKyAgICAgICAgc3RyZWFtLnBhcnNlKGluKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RXaGVuUmVjdXJzZVNob3VsZFJlY3Vyc2VJbm5lck1haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLnNldFJlY3Vyc2lvbk1vZGUoTWltZVRva2VuU3RyZWFtLk1fUkVDVVJTRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIAorICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTVVMVElQQVJUKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKTsKKyAgICAgICAgbmV4dFNob3VsZEJlU3RhbmRhcmRQYXJ0KGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgIG5leHRTaG91bGRCZVN0YW5kYXJkUGFydCh0cnVlKTsKKyAgICAgICAgCisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9NRVNTQUdFKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9QUkVBTUJMRSk7CisgICAgICAgIG5leHRTaG91bGRCZVN0YW5kYXJkUGFydCh0cnVlKTsKKyAgICAgICAgbmV4dFNob3VsZEJlU3RhbmRhcmRQYXJ0KHRydWUpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRVBJTE9HVUUpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX01VTFRJUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICBuZXh0U2hvdWxkQmVTdGFuZGFyZFBhcnQodHJ1ZSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FUElMT0dVRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTVVMVElQQVJUKTsKKyAgICB9CisgICAgCisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2hlblJlY3Vyc2VTaG91bGRUcmVhdElubmVyTWFpbEFzQW55T3RoZXJQYXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cmVhbS5zZXRSZWN1cnNpb25Nb2RlKE1pbWVUb2tlblN0cmVhbS5NX05PX1JFQ1VSU0UpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICAKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9QUkVBTUJMRSk7CisgICAgICAgIG5leHRTaG91bGRCZVN0YW5kYXJkUGFydChmYWxzZSk7CisgICAgICAgIAorICAgICAgICBuZXh0U2hvdWxkQmVTdGFuZGFyZFBhcnQodHJ1ZSk7CisgICAgICAgIG5leHRTaG91bGRCZVN0YW5kYXJkUGFydCh0cnVlKTsKKyAgICAgICAgbmV4dFNob3VsZEJlU3RhbmRhcmRQYXJ0KHRydWUpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRVBJTE9HVUUpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX01VTFRJUEFSVCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGVuTm9SZWN1cnNlSW5wdXRTdHJlYW1TaG91bGRDb250YWluSW5uZXJNYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cmVhbS5zZXRSZWN1cnNpb25Nb2RlKE1pbWVUb2tlblN0cmVhbS5NX05PX1JFQ1VSU0UpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICAKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9QUkVBTUJMRSk7CisgICAgICAgIG5leHRTaG91bGRCZVN0YW5kYXJkUGFydChmYWxzZSk7CisgICAgICAgIAorICAgICAgICBuZXh0U2hvdWxkQmVTdGFuZGFyZFBhcnQodHJ1ZSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBzdHJlYW0uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgaW50IG5leHQgPSBpbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgIGludCBpPTA7CisgICAgICAgIHdoaWxlIChuZXh0ICE9IC0xKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkAiICsgaSwgSU5ORVJfTUFJTC5jaGFyQXQoaSsrKSwgKGNoYXIpIG5leHQpOworICAgICAgICAgICAgbmV4dCA9IGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoSU5ORVJfTUFJTC5sZW5ndGgoKS0yLCBpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNldE5vUmVjdXJzZVNvSW5wdXRTdHJlYW1TaG91bGRDb250YWluSW5uZXJNYWlsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIAorICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTVVMVElQQVJUKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKTsKKyAgICAgICAgbmV4dFNob3VsZEJlU3RhbmRhcmRQYXJ0KGZhbHNlKTsKKyAgICAgICAgCisgICAgICAgIG5leHRTaG91bGRCZVN0YW5kYXJkUGFydCh0cnVlKTsKKyAgICAgICAgc3RyZWFtLnNldFJlY3Vyc2lvbk1vZGUoTWltZVRva2VuU3RyZWFtLk1fTk9fUkVDVVJTRSk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBzdHJlYW0uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgaW50IG5leHQgPSBpbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgIGludCBpPTA7CisgICAgICAgIHdoaWxlIChuZXh0ICE9IC0xKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkAiICsgaSwgSU5ORVJfTUFJTC5jaGFyQXQoaSsrKSwgKGNoYXIpIG5leHQpOworICAgICAgICAgICAgbmV4dCA9IGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoSU5ORVJfTUFJTC5sZW5ndGgoKS0yLCBpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbmV4dFNob3VsZEJlU3RhbmRhcmRQYXJ0KGJvb2xlYW4gd2l0aEhlYWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBpZiAod2l0aEhlYWRlcikgeworICAgICAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgfQorICAgICAgICBuZXh0SXMoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIG5leHRJcyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgbmV4dElzKE1pbWVUb2tlblN0cmVhbS5UX0VORF9CT0RZUEFSVCk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBuZXh0SXMoaW50IHN0YXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHN0YXRlKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoc3RyZWFtLm5leHQoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVUb2tlblN0cmVhbUJvZHlEZXNjcmlwdG9yVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVRva2VuU3RyZWFtQm9keURlc2NyaXB0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiNGU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVUb2tlblN0cmVhbUJvZHlEZXNjcmlwdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouRXhhbXBsZU1haWw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouZGVzY3JpcHRvci5Cb2R5RGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZVRva2VuU3RyZWFtOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIE1pbWVUb2tlblN0cmVhbUJvZHlEZXNjcmlwdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIE1pbWVUb2tlblN0cmVhbSBwYXJzZXI7CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgcGFyc2VyID0gbmV3IE1pbWVUb2tlblN0cmVhbSgpOworICAgICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKEV4YW1wbGVNYWlsLk1JTUVfTVVMVElQQVJUX0FMVEVSTkFUSVZFX0JZVEVTKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUmV0dXJuVmFsaWREZXNjcmlwdG9yRm9yUHJlYW1ibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUiksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTVVMVElQQVJUKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfUFJFQU1CTEUpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIEJvZHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBwYXJzZXIuZ2V0Qm9keURlc2NyaXB0b3IoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNzI5IiwgZGVzY3JpcHRvci5nZXRCb3VuZGFyeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCAibXVsdGlwYXJ0L2FsdGVybmF0aXZlIiwgZGVzY3JpcHRvci5nZXRNaW1lVHlwZSgpKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFJldHVyblZhbGlkRGVzY3JpcHRvckZvckVwaWxvZ3VlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUiksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksIE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRVBJTE9HVUUpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisKKyAgICAgICAgQm9keURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHBhcnNlci5nZXRCb2R5RGVzY3JpcHRvcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRlc2NyaXB0b3IpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE3MjkiLCBkZXNjcmlwdG9yLmdldEJvdW5kYXJ5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoICJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiLCBkZXNjcmlwdG9yLmdldE1pbWVUeXBlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVUb2tlblN0cmVhbVJlYWRlclRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL01pbWVUb2tlblN0cmVhbVJlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWJhOTNhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVRva2VuU3RyZWFtUmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLklPVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouRXhhbXBsZU1haWw7CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouTWltZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZVRva2VuU3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgTWltZVRva2VuU3RyZWFtUmVhZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICAKKyAgICBNaW1lVG9rZW5TdHJlYW0gcGFyc2VyOworICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHBhcnNlciA9IG5ldyBNaW1lVG9rZW5TdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRSZWFkU2ltcGxlQm9keSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBFeGFtcGxlTWFpbC5SRkM4MjJfU0lNUExFX0JZVEVTOworICAgICAgICBTdHJpbmcgYm9keSA9IEV4YW1wbGVNYWlsLlJGQzgyMl9TSU1QTEVfQk9EWTsKKyAgICAgICAgY2hlY2tTaW1wbGVNYWlsKGJ5dGVzLCBib2R5LCA0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUmVhZE9uZVBhcnRNaW1lQVNDSUlCb2R5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IEV4YW1wbGVNYWlsLk9ORV9QQVJUX01JTUVfQVNDSUlfQllURVM7CisgICAgICAgIFN0cmluZyBib2R5ID0gRXhhbXBsZU1haWwuT05FX1BBUlRfTUlNRV9BU0NJSV9CT0RZOworICAgICAgICBjaGVja1NpbXBsZU1haWwoYnl0ZXMsIGJvZHksIDExKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUmVhZE9uZVBhcnRNaW1lODg1OUJvZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRXhhbXBsZU1haWwuT05FX1BBUlRfTUlNRV84ODU5X0JZVEVTOworICAgICAgICBTdHJpbmcgYm9keSA9IEV4YW1wbGVNYWlsLk9ORV9QQVJUX01JTUVfODg1OV9CT0RZOworICAgICAgICBjaGVja1NpbXBsZU1haWwoYnl0ZXMsIGJvZHksIDEzKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFJlYWRPbmVQYXJ0TWltZUJhc2U2NEFTQ0lJQm9keSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBFeGFtcGxlTWFpbC5PTkVfUEFSVF9NSU1FX0JBU0U2NF9BU0NJSV9CWVRFUzsKKyAgICAgICAgU3RyaW5nIGJvZHkgPSBFeGFtcGxlTWFpbC5PTkVfUEFSVF9NSU1FX0JBU0U2NF9BU0NJSV9CT0RZOworICAgICAgICBjaGVja1NpbXBsZU1haWwoYnl0ZXMsIGJvZHksIDExKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFJlYWRPbmVQYXJ0TWltZUJhc2U2NExhdGluMUJvZHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gRXhhbXBsZU1haWwuT05FX1BBUlRfTUlNRV9CQVNFNjRfTEFUSU4xX0JZVEVTOworICAgICAgICBTdHJpbmcgYm9keSA9IEV4YW1wbGVNYWlsLk9ORV9QQVJUX01JTUVfQkFTRTY0X0xBVElOMV9CT0RZOworICAgICAgICBjaGVja1NpbXBsZU1haWwoYnl0ZXMsIGJvZHksIDExKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFJlYWRPbmVQYXJ0TWltZVF1b3RlZFByaW50YWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gYnl0ZXMgPSBFeGFtcGxlTWFpbC5PTkVfUEFSVF9NSU1FX1FVT1RFRF9QUklOVEFCTEVfQVNDSUlfQllURVM7CisgICAgICAgIFN0cmluZyBib2R5ID0gRXhhbXBsZU1haWwuT05FX1BBUlRfTUlNRV9RVU9URURfUFJJTlRBQkxFX0FTQ0lJX0JPRFk7CisgICAgICAgIGNoZWNrU2ltcGxlTWFpbChieXRlcywgYm9keSwgMTEpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUmVhZFBhcnRCb2RpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1pbWVFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShFeGFtcGxlTWFpbC5NSU1FX01JWEVEX01VTFRJUEFSVF9WQVJJT1VTX0VOQ09ESU5HU19CWVRFUyk7CisgICAgICAgIHBhcnNlci5wYXJzZShpbik7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8NTtpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKSxNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9NVUxUSVBBUlQpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKSxNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCksTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKSxNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgY2hlY2tCb2R5KEV4YW1wbGVNYWlsLk1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTXzdCSVQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKSxNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCksTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKSxNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgY2hlY2tCb2R5KEV4YW1wbGVNYWlsLk1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX1FVT1RFRF9QUklOVEFCTEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKSxNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCksTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKSxNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCksTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgY2hlY2tCb2R5KEV4YW1wbGVNYWlsLk1JTUVfTUlYRURfTVVMVElQQVJUX1ZBUklPVVNfRU5DT0RJTkdTX0JBU0U2NCk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKworICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2ltcGxlTWFpbChieXRlW10gYnl0ZXMsIFN0cmluZyBib2R5LCBpbnQgZmllbGRzKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1pbWVFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcyk7CisgICAgICAgIHBhcnNlci5wYXJzZShpbik7CisgICAgICAgIGFzc2VydEVxdWFscyhNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgZm9yIChpbnQgaT0wO2k8ZmllbGRzO2krKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKSxNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhwYXJzZXIubmV4dCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpLE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHBhcnNlci5uZXh0KCkpKTsKKyAgICAgICAgY2hlY2tCb2R5KGJvZHkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0JvZHkoU3RyaW5nIGJvZHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0UmVhZGVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJvZHksIElPVXRpbHMudG9TdHJpbmcocmVhZGVyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVRva2VuU3RyZWFtVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTWltZVRva2VuU3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTAwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NaW1lVG9rZW5TdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5FeGFtcGxlTWFpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuRW50aXR5U3RhdGVzOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5NaW1lVG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLlJlY3Vyc2lvbk1vZGU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgTWltZVRva2VuU3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIE1pbWVUb2tlblN0cmVhbSBzdHJlYW07CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtID0gbmV3IE1pbWVUb2tlblN0cmVhbSgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UmVjdXJzaW9uTW9kZUJlZm9yZVBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cmVhbS5zZXRSZWN1cnNpb25Nb2RlKFJlY3Vyc2lvbk1vZGUuTV9OT19SRUNVUlNFKTsKKyAgICAgICAgc3RyZWFtLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShFeGFtcGxlTWFpbC5NQUlMX1dJVEhfUkZDODIyX1BBUlRfQllURVMpKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfRklFTEQpOworICAgICAgICBjaGVja05leHRJcyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfRklFTEQpOworICAgICAgICBjaGVja05leHRJcyhFbnRpdHlTdGF0ZXMuVF9GSUVMRCk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX1BSRUFNQkxFKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfU1RBUlRfQk9EWVBBUlQpOworICAgICAgICBjaGVja05leHRJcyhFbnRpdHlTdGF0ZXMuVF9TVEFSVF9IRUFERVIpOworICAgICAgICBjaGVja05leHRJcyhFbnRpdHlTdGF0ZXMuVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfQk9EWSk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX1NUQVJUX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfRklFTEQpOworICAgICAgICBjaGVja05leHRJcyhFbnRpdHlTdGF0ZXMuVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfQk9EWSk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX1NUQVJUX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfRklFTEQpOworICAgICAgICBjaGVja05leHRJcyhFbnRpdHlTdGF0ZXMuVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfQk9EWSk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX1NUQVJUX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfRklFTEQpOworICAgICAgICBjaGVja05leHRJcyhFbnRpdHlTdGF0ZXMuVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfQk9EWSk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX0VQSUxPR1VFKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfRU5EX01VTFRJUEFSVCk7CisgICAgICAgIGNoZWNrTmV4dElzKEVudGl0eVN0YXRlcy5UX0VORF9NRVNTQUdFKTsKKyAgICAgICAgY2hlY2tOZXh0SXMoRW50aXR5U3RhdGVzLlRfRU5EX09GX1NUUkVBTSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBjaGVja05leHRJcyhpbnQgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcoZXhwZWN0ZWQpLCBNaW1lVG9rZW5TdHJlYW0uc3RhdGVUb1N0cmluZyhzdHJlYW0ubmV4dCgpKSk7ICAgICAgICAKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NdWx0aXBhcnRTdHJlYW1UZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9NdWx0aXBhcnRTdHJlYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiNjg1MAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL011bHRpcGFydFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CisKK3B1YmxpYyBjbGFzcyBNdWx0aXBhcnRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBVU19BU0NJSSA9IENoYXJzZXRVdGlsLlVTX0FTQ0lJOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gIkEgUHJlYW1ibGVcclxuIiArCisgICAgICAgICAgICAgICAgIi0tMTcyOVxyXG5cclxuIiArCisgICAgICAgICAgICAgICAgIlNpbXBsZSBwbGFpbiB0ZXh0XHJcbiIgKworICAgICAgICAgICAgICAgICItLTE3MjlcclxuIiArCisgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG5cclxuIiArCisgICAgICAgICAgICAgICAgIlNvbWUgbW9yZSB0ZXh0XHJcbiIgKworICAgICAgICAgICAgICAgICItLTE3MjktLVxyXG4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiVG86IFJvYWQgUnVubmVyIDxydW5uZXJAZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICAgICAgICAgIkZyb206IFdpbGUgRS4gQ2F5b3RlIDx3aWxlQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICJEYXRlOiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpXHJcbiIgKworICAgICAgICAgICAgIlN1YmplY3Q6IE1haWxcclxuIiArCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7Ym91bmRhcnk9MTcyOVxyXG5cclxuIiArCisgICAgICAgICAgICBCT0RZOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBMRVhfTUVTU0FHRSA9ICJUbzogV2lsZSBFLiBDYXlvdGUgPHdpbGVAZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICJGcm9tOiBSb2FkIFJ1bm5lciA8cnVubmVyQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAiRGF0ZTogVHVlLCAxOSBGZWIgMjAwOCAxNzozNDowOSArMDAwMCAoR01UKVxyXG4iICsKKyAgICAiU3ViamVjdDogTWFpbFxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7Ym91bmRhcnk9NDJcclxuXHJcbiIgKworICAgICJBIGxpdHRsZSBwcmVhbWJsZVxyXG4iICsKKyAgICAiLS00MlxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcblxyXG4iICsKKyAgICAiUmh1YmFyZCFcclxuIiArCisgICAgIi0tNDJcclxuIiArCisgICAgIkNvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjJcclxuXHJcbiIgKworICAgIE1FU1NBR0UgKworICAgICJcclxuIiArCisgICAgIi0tNDJcclxuIiArCisgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG5cclxuIiArCisgICAgIkN1c3RhcmQhIiArCisgICAgIlxyXG4iICsKKyAgICAiLS00Mi0tXHJcbiI7CisgICAgCisgICAgTWltZVRva2VuU3RyZWFtIHBhcnNlcjsKKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBwYXJzZXIgPSBuZXcgTWltZVRva2VuU3RyZWFtKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFN1cHBseUlucHV0U3RyZWFtRm9yU2ltcGxlQm9keSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFVTX0FTQ0lJLmVuY29kZShNRVNTQUdFKS5hcnJheSgpKSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIElucHV0U3RyZWFtIG91dCA9IHBhcnNlci5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoQk9EWSwgSU9VdGlscy50b1N0cmluZyhvdXQsICJ1cy1hc2NpaSIpKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTVVMVElQQVJUKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdElucHV0U3RyZWFtU2hvdWxkUmVhZE9ubHlNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVVNfQVNDSUkuZW5jb2RlKENPTVBMRVhfTUVTU0FHRSkuYXJyYXkoKSkpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9NVUxUSVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTUVTU0FHRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIElucHV0U3RyZWFtIG91dCA9IHBhcnNlci5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoQk9EWSwgSU9VdGlscy50b1N0cmluZyhvdXQsICJ1cy1hc2NpaSIpKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTVVMVElQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FUElMT0dVRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX01VTFRJUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX01FU1NBR0UpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9PRl9TVFJFQU0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1N0YXRlKGZpbmFsIGludCBzdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBNaW1lRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHN0YXRlKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL011bHRpcGFydFRva2Vuc1Rlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL011bHRpcGFydFRva2Vuc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFlZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvTXVsdGlwYXJ0VG9rZW5zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5NaW1lRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWwuQ2hhcnNldFV0aWw7CisKK3B1YmxpYyBjbGFzcyBNdWx0aXBhcnRUb2tlbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBVU19BU0NJSSA9IENoYXJzZXRVdGlsLlVTX0FTQ0lJOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gIkEgUHJlYW1ibGVcclxuIiArCisgICAgICAgICAgICAgICAgIi0tMTcyOVxyXG5cclxuIiArCisgICAgICAgICAgICAgICAgIlNpbXBsZSBwbGFpbiB0ZXh0XHJcbiIgKworICAgICAgICAgICAgICAgICItLTE3MjlcclxuIiArCisgICAgICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VUy1BU0NJSVxyXG5cclxuIiArCisgICAgICAgICAgICAgICAgIlNvbWUgbW9yZSB0ZXh0XHJcbiIgKworICAgICAgICAgICAgICAgICItLTE3MjktLVxyXG4iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiVG86IFJvYWQgUnVubmVyIDxydW5uZXJAZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICAgICAgICAgIkZyb206IFdpbGUgRS4gQ2F5b3RlIDx3aWxlQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAgICAgICAgICJEYXRlOiBUdWUsIDEyIEZlYiAyMDA4IDE3OjM0OjA5ICswMDAwIChHTVQpXHJcbiIgKworICAgICAgICAgICAgIlN1YmplY3Q6IE1haWxcclxuIiArCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7Ym91bmRhcnk9MTcyOVxyXG5cclxuIiArCisgICAgICAgICAgICBCT0RZOworICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBMRVhfTUVTU0FHRSA9ICJUbzogV2lsZSBFLiBDYXlvdGUgPHdpbGVAZXhhbXBsZS5vcmc+XHJcbiIgKworICAgICJGcm9tOiBSb2FkIFJ1bm5lciA8cnVubmVyQGV4YW1wbGUub3JnPlxyXG4iICsKKyAgICAiRGF0ZTogVHVlLCAxOSBGZWIgMjAwOCAxNzozNDowOSArMDAwMCAoR01UKVxyXG4iICsKKyAgICAiU3ViamVjdDogTWFpbFxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7Ym91bmRhcnk9NDJcclxuXHJcbiIgKworICAgICJBIGxpdHRsZSBwcmVhbWJsZVxyXG4iICsKKyAgICAiLS00MlxyXG4iICsKKyAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVTLUFTQ0lJXHJcblxyXG4iICsKKyAgICAiUmh1YmFyZCFcclxuIiArCisgICAgIi0tNDJcclxuIiArCisgICAgIkNvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjJcclxuXHJcbiIgKworICAgIE1FU1NBR0UgKworICAgICJcclxuIiArCisgICAgIi0tNDJcclxuIiArCisgICAgIlxyXG4iICsKKyAgICAiQ3VzdGFyZCEiICsKKyAgICAiXHJcbiIgKworICAgICItLTQyLS1cclxuIjsKKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QTEVYX1FQX01FU1NBR0UgPSAKKyAgICAgICAgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGVcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyOyBjaGFyc2V0PXVzLWFzY2lpXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiU3ViamVjdDogVGhlIHN1YmplY3RcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTtcclxuIiArCisgICAgICAgICIgICAgICAgIGJvdW5kYXJ5PTNEPTIyLS0tLT0zRE5leHRQYXJ0PTIyXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC5cclxuIiArCisgICAgICAgICJcclxuIiArCisgICAgICAgICItLS0tLS09M0ROZXh0UGFydFxyXG4iICsKKyAgICAgICAgIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjtcclxuIiArCisgICAgICAgICIgICAgICAgIGNoYXJzZXQ9M0Q9MjJpc28tODg1OS0xPTIyXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiU29tZSB0ZXh0XHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiLS0tLS0tPTNETmV4dFBhcnRcclxuIiArCisgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvaHRtbDtcclxuIiArCisgICAgICAgICIgICAgICAgIGNoYXJzZXQ9M0Q9MjJpc28tODg1OS0xPTIyXHJcbiIgKworICAgICAgICAiXHJcbiIgKworICAgICAgICAiPEhUTUw+PEJPRFk+PTNEIFNvbWUgSFRNTCA9M0Q8L0JPRFk+PC9IVE1MPlxyXG4iICsKKyAgICAgICAgIi0tLS0tLT0zRE5leHRQYXJ0LS1cclxuIiArCisgICAgICAgICJcclxuIiArCisgICAgICAgICJcclxuIjsKKyAgICAKKyAgICBNaW1lVG9rZW5TdHJlYW0gcGFyc2VyOworICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHBhcnNlciA9IG5ldyBNaW1lVG9rZW5TdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUGFyc2VTaW1wbGVNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVVNfQVNDSUkuZW5jb2RlKE1FU1NBR0UpLmFycmF5KCkpKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTVVMVElQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9QUkVBTUJMRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FUElMT0dVRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX01VTFRJUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX01FU1NBR0UpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9PRl9TVFJFQU0pOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUGFyc2VNb3JlQ29tcGxleE1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9XCJvdXRlci1ib3VuZGFyeVwiXHJcbiIgKworICAgICAgICAgICAgIlxyXG4iICsKKyAgICAgICAgICAgICItLW91dGVyLWJvdW5kYXJ5XHJcbiIgKworICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT1cImlubmVyLWJvdW5kYXJ5XCJcclxuIiArCisgICAgICAgICAgICAiXHJcbiIgKworICAgICAgICAgICAgIi0taW5uZXItYm91bmRhcnlcclxuIiArCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIgKworICAgICAgICAgICAgIlxyXG4iICsKKyAgICAgICAgICAgICJTb21lIHRleHRcclxuIiArCisgICAgICAgICAgICAiLS1pbm5lci1ib3VuZGFyeS0tXHJcbiIgKworICAgICAgICAgICAgIlxyXG4iICsKKyAgICAgICAgICAgICJmb29cclxuIiArCisgICAgICAgICAgICAiLS1vdXRlci1ib3VuZGFyeS0tXHJcbiI7CisgICAgICAgIAorICAgICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFVTX0FTQ0lJLmVuY29kZShtZXNzYWdlKS5hcnJheSgpKSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTVVMVElQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9QUkVBTUJMRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfUFJFQU1CTEUpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VQSUxPR1VFKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTVVMVElQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VQSUxPR1VFKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTVVMVElQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX09GX1NUUkVBTSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRQYXJzZU1lc3NhZ2VXaXRoRW1iZWRkZWRNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHBhcnNlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVVNfQVNDSUkuZW5jb2RlKENPTVBMRVhfTUVTU0FHRSkuYXJyYXkoKSkpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01VTFRJUEFSVCk7CisgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKTsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpOworICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpOworICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICAgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTUVTU0FHRSk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfTVVMVElQQVJUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfUFJFQU1CTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7ICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfQk9EWVBBUlQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FUElMT0dVRSk7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX01VTFRJUEFSVCk7CisgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0JPRFlQQVJUKTsKKyAgICAgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0JPRFkpOworICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FUElMT0dVRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX01VTFRJUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX01FU1NBR0UpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9PRl9TVFJFQU0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRQYXJzZU1lc3NhZ2VzV2l0aEVtYmVkZGVkUXVvdGVkUHJpbnRhYmxlRW5jb2RlZE1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShVU19BU0NJSS5lbmNvZGUoQ09NUExFWF9RUF9NRVNTQUdFKS5hcnJheSgpKSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX01FU1NBR0UpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRklFTEQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9NVUxUSVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIHBhcnNlci5nZXRCb2R5RGVzY3JpcHRvcigpLmdldE1pbWVUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlzby04ODU5LTEiLCBwYXJzZXIuZ2V0Qm9keURlc2NyaXB0b3IoKS5nZXRDaGFyc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNvbWUgdGV4dFxyXG4iLCAKKyAgICAgICAgICAgICAgICBJT1V0aWxzLnRvU3RyaW5nKHBhcnNlci5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX0hFQURFUik7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfQk9EWSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9odG1sIiwgcGFyc2VyLmdldEJvZHlEZXNjcmlwdG9yKCkuZ2V0TWltZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaXNvLTg4NTktMSIsIHBhcnNlci5nZXRCb2R5RGVzY3JpcHRvcigpLmdldENoYXJzZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiPEhUTUw+PEJPRFk+PSBTb21lIEhUTUwgPTwvQk9EWT48L0hUTUw+IiwgCisgICAgICAgICAgICAgICAgSU9VdGlscy50b1N0cmluZyhwYXJzZXIuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRVBJTE9HVUUpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9NVUxUSVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VORF9NRVNTQUdFKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX09GX1NUUkVBTSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBhcnRNZXNzYWdlV2l0aG91dEhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBwYXJzZXIucGFyc2VIZWFkbGVzcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oVVNfQVNDSUkuZW5jb2RlKEJPRFkpLmFycmF5KCkpLCAKKyAgICAgICAgICAgICAgICAibXVsdGlwYXJ0L21peGVkO2JvdW5kYXJ5PTE3MjkiKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9NVUxUSVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1BSRUFNQkxFKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9CT0RZUEFSVCk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0JPRFlQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9TVEFSVF9IRUFERVIpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxEKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfSEVBREVSKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9CT0RZKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfQk9EWVBBUlQpOworICAgICAgICBjaGVja1N0YXRlKE1pbWVUb2tlblN0cmVhbS5UX0VQSUxPR1VFKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTVVMVElQQVJUKTsKKyAgICAgICAgY2hlY2tTdGF0ZShNaW1lVG9rZW5TdHJlYW0uVF9FTkRfTUVTU0FHRSk7CisgICAgICAgIGNoZWNrU3RhdGUoTWltZVRva2VuU3RyZWFtLlRfRU5EX09GX1NUUkVBTSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBjaGVja1N0YXRlKGZpbmFsIGludCBzdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBNaW1lRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1pbWVUb2tlblN0cmVhbS5zdGF0ZVRvU3RyaW5nKHN0YXRlKSwgTWltZVRva2VuU3RyZWFtLnN0YXRlVG9TdHJpbmcocGFyc2VyLm5leHQoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL1N0cmljdE1pbWVUb2tlblN0cmVhbVRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovcGFyc2VyL1N0cmljdE1pbWVUb2tlblN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Q0OWMwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvU3RyaWN0TWltZVRva2VuU3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyOworCitpbXBvcnQgb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoucGFyc2VyLkV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5NaW1lUGFyc2VFdmVudEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXIuTWltZVRva2VuU3RyZWFtOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFN0cmljdE1pbWVUb2tlblN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9PTkxZID0gIkZyb206IGZvb0BhYnIuY29tXHJcblN1YmplY3Q6IEEgc3ViamVjdFxyXG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JSRUNUX0hFQURFUlMgPSBIRUFERVJfT05MWSArICJcclxuIjsKKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5leHBlY3RlZEVuZE9mSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgTWltZVRva2VuU3RyZWFtIHBhcnNlciA9IE1pbWVUb2tlblN0cmVhbS5jcmVhdGVTdHJpY3RWYWxpZGF0aW9uU3RyZWFtKCk7CisgICAgICAgIAorICAgICAgICBwYXJzZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKEhFQURFUl9PTkxZLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgCisgICAgICAgIGFzc2VydEVxdWFscygiSGVhZGVycyBzdGFydCIsIE1pbWVUb2tlblN0cmVhbS5UX1NUQVJUX0hFQURFUiwgcGFyc2VyLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmllbGQiLCBNaW1lVG9rZW5TdHJlYW0uVF9GSUVMRCwgcGFyc2VyLm5leHQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwYXJzZXIubmV4dCgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChNaW1lUGFyc2VFdmVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlByZW1hdHVyZSBlbmQgb2YgaGVhZGVycyIsIEV2ZW50LkhFQURFUlNfUFJFTUFUVVJFX0VORCwgZS5nZXRFdmVudCgpKTsKKyAgICAgICAgfQorICAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RFbmRPZkhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgCisgICAgICAgIE1pbWVUb2tlblN0cmVhbSBwYXJzZXIgPSBNaW1lVG9rZW5TdHJlYW0uY3JlYXRlU3RyaWN0VmFsaWRhdGlvblN0cmVhbSgpOworICAgICAgICAKKyAgICAgICAgcGFyc2VyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShDT1JSRUNUX0hFQURFUlMuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWFkZXJzIHN0YXJ0IiwgTWltZVRva2VuU3RyZWFtLlRfU1RBUlRfSEVBREVSLCBwYXJzZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGcm9tIGhlYWRlciIsIE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxELCBwYXJzZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdWJqZWN0IGhlYWRlciIsIE1pbWVUb2tlblN0cmVhbS5UX0ZJRUxELCBwYXJzZXIubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFbmQgbWVzc2FnZSIsIE1pbWVUb2tlblN0cmVhbS5UX0VORF9IRUFERVIsIHBhcnNlci5uZXh0KCkpOworICAgICB9Cit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3BhcnNlci9UZXN0SGFuZGxlci5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvVGVzdEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJmNzAwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9wYXJzZXIvVGVzdEhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5wYXJzZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai5kZXNjcmlwdG9yLkJvZHlEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnBhcnNlci5Db250ZW50SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkNvbnRlbnRVdGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBydW4gY29tcGFyaXNvbiBvZiBwYXJzZWQgcmVzdWx0cworICovCitjbGFzcyBUZXN0SGFuZGxlciBpbXBsZW1lbnRzIENvbnRlbnRIYW5kbGVyIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZShjaGFyIGMpIHsKKyAgICAgICAgaWYgKGMgPT0gJyYnKSB7CisgICAgICAgICAgICByZXR1cm4gIiZhbXA7IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA9PSAnPicpIHsKKyAgICAgICAgICAgIHJldHVybiAiJmd0OyI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPT0gJzwnKSB7CisgICAgICAgICAgICByZXR1cm4gIiZsdDsiOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiIiArIGM7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZShTdHJpbmcgcykgeworICAgICAgICBzID0gcy5yZXBsYWNlQWxsKCImIiwgIiZhbXA7Iik7CisgICAgICAgIHMgPSBzLnJlcGxhY2VBbGwoIj4iLCAiJmd0OyIpOworICAgICAgICBzID0gcy5yZXBsYWNlQWxsKCI8IiwgIiZsdDsiKTsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGVwaWxvZ3VlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzYi5hcHBlbmQoIjxlcGlsb2d1ZT5cclxuIik7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgd2hpbGUgKChiID0gaXMucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZSgoY2hhcikgYikpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiPC9lcGlsb2d1ZT5cclxuIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHByZWFtYmxlKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzYi5hcHBlbmQoIjxwcmVhbWJsZT5cclxuIik7CisgICAgICAgIGludCBiID0gMDsKKyAgICAgICAgd2hpbGUgKChiID0gaXMucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGVzY2FwZSgoY2hhcikgYikpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiPC9wcmVhbWJsZT5cclxuIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TXVsdGlwYXJ0KEJvZHlEZXNjcmlwdG9yIGJkKSB7CisgICAgICAgIHNiLmFwcGVuZCgiPG11bHRpcGFydD5cclxuIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGJvZHkoQm9keURlc2NyaXB0b3IgYmQsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzYi5hcHBlbmQoIjxib2R5PlxyXG4iKTsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICB3aGlsZSAoKGIgPSBpcy5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoZXNjYXBlKChjaGFyKSBiKSk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCI8L2JvZHk+XHJcbiIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBlbmRNdWx0aXBhcnQoKSB7CisgICAgICAgIHNiLmFwcGVuZCgiPC9tdWx0aXBhcnQ+XHJcbiIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzdGFydEJvZHlQYXJ0KCkgeworICAgICAgICBzYi5hcHBlbmQoIjxib2R5LXBhcnQ+XHJcbiIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBlbmRCb2R5UGFydCgpIHsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2JvZHktcGFydD5cclxuIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0SGVhZGVyKCkgeworICAgICAgICBzYi5hcHBlbmQoIjxoZWFkZXI+XHJcbiIpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBmaWVsZChGaWVsZCBmaWVsZCkgeworICAgICAgICBzYi5hcHBlbmQoIjxmaWVsZD5cclxuIgorICAgICAgICAgICAgICAgICsgZXNjYXBlKENvbnRlbnRVdGlsLmRlY29kZShmaWVsZC5nZXRSYXcoKSkpCisgICAgICAgICAgICAgICAgKyAiPC9maWVsZD5cclxuIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGVuZEhlYWRlcigpIHsKKyAgICAgICAgc2IuYXBwZW5kKCI8L2hlYWRlcj5cclxuIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0TWVzc2FnZSgpIHsKKyAgICAgICAgc2IuYXBwZW5kKCI8bWVzc2FnZT5cclxuIik7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIGVuZE1lc3NhZ2UoKSB7CisgICAgICAgIHNiLmFwcGVuZCgiPC9tZXNzYWdlPlxyXG4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByYXcoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE1pbWVTdHJlYW1QYXJzZXJFeGFtcGxlTWVzc2FnZXNUZXN0LmZhaWwoInJhdyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9EZWZhdWx0U3RvcmFnZVByb3ZpZGVyVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL0RlZmF1bHRTdG9yYWdlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxYjYxOAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9EZWZhdWx0U3RvcmFnZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIERlZmF1bHRTdG9yYWdlUHJvdmlkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoCisgICAgICAgICAgICAgICAgRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5ERUZBVUxUX1NUT1JBR0VfUFJPVklERVJfUFJPUEVSVFkpOworICAgICAgICBEZWZhdWx0U3RvcmFnZVByb3ZpZGVyLnJlc2V0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZSgKKyAgICAgICAgICAgICAgICBEZWZhdWx0U3RvcmFnZVByb3ZpZGVyLkRFRkFVTFRfU1RPUkFHRV9QUk9WSURFUl9QUk9QRVJUWSk7CisgICAgICAgIERlZmF1bHRTdG9yYWdlUHJvdmlkZXIucmVzZXQoKTsKKworICAgICAgICBTdG9yYWdlUHJvdmlkZXIgaW5zdGFuY2UgPSBEZWZhdWx0U3RvcmFnZVByb3ZpZGVyLmdldEluc3RhbmNlKCk7CisgICAgICAgIGFzc2VydFRydWUoaW5zdGFuY2UgaW5zdGFuY2VvZiBUaHJlc2hvbGRTdG9yYWdlUHJvdmlkZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KAorICAgICAgICAgICAgICAgIERlZmF1bHRTdG9yYWdlUHJvdmlkZXIuREVGQVVMVF9TVE9SQUdFX1BST1ZJREVSX1BST1BFUlRZLAorICAgICAgICAgICAgICAgIE1lbW9yeVN0b3JhZ2VQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBEZWZhdWx0U3RvcmFnZVByb3ZpZGVyLnJlc2V0KCk7CisKKyAgICAgICAgU3RvcmFnZVByb3ZpZGVyIGluc3RhbmNlID0gRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpOworICAgICAgICBhc3NlcnRUcnVlKGluc3RhbmNlIGluc3RhbmNlb2YgTWVtb3J5U3RvcmFnZVByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0dGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2VQcm92aWRlciBpbnN0YW5jZSA9IG5ldyBNZW1vcnlTdG9yYWdlUHJvdmlkZXIoKTsKKworICAgICAgICBEZWZhdWx0U3RvcmFnZVByb3ZpZGVyLnNldEluc3RhbmNlKGluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0U2FtZShpbnN0YW5jZSwgRGVmYXVsdFN0b3JhZ2VQcm92aWRlci5nZXRJbnN0YW5jZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9NdWx0aVJlZmVyZW5jZVN0b3JhZ2VUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvTXVsdGlSZWZlcmVuY2VTdG9yYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDBiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3N0b3JhZ2UvTXVsdGlSZWZlcmVuY2VTdG9yYWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnN0b3JhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIE11bHRpUmVmZXJlbmNlU3RvcmFnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9yd2FyZHNHZXRJbnB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEdW1teVN0b3JhZ2Ugc3RvcmFnZSA9IG5ldyBEdW1teVN0b3JhZ2UoKTsKKyAgICAgICAgTXVsdGlSZWZlcmVuY2VTdG9yYWdlIG11bHRpUmVmZXJlbmNlU3RvcmFnZSA9IG5ldyBNdWx0aVJlZmVyZW5jZVN0b3JhZ2UoCisgICAgICAgICAgICAgICAgc3RvcmFnZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVBcnJheUlucHV0U3RyZWFtLmNsYXNzLCBtdWx0aVJlZmVyZW5jZVN0b3JhZ2UKKyAgICAgICAgICAgICAgICAuZ2V0SW5wdXRTdHJlYW0oKS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIER1bW15U3RvcmFnZSBzdG9yYWdlID0gbmV3IER1bW15U3RvcmFnZSgpOworICAgICAgICBNdWx0aVJlZmVyZW5jZVN0b3JhZ2UgbXVsdGlSZWZlcmVuY2VTdG9yYWdlID0gbmV3IE11bHRpUmVmZXJlbmNlU3RvcmFnZSgKKyAgICAgICAgICAgICAgICBzdG9yYWdlKTsKKworICAgICAgICBhc3NlcnRGYWxzZShzdG9yYWdlLmRlbGV0ZWQpOworCisgICAgICAgIG11bHRpUmVmZXJlbmNlU3RvcmFnZS5kZWxldGUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdG9yYWdlLmRlbGV0ZWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEdW1teVN0b3JhZ2Ugc3RvcmFnZSA9IG5ldyBEdW1teVN0b3JhZ2UoKTsKKyAgICAgICAgTXVsdGlSZWZlcmVuY2VTdG9yYWdlIG11bHRpUmVmZXJlbmNlU3RvcmFnZSA9IG5ldyBNdWx0aVJlZmVyZW5jZVN0b3JhZ2UoCisgICAgICAgICAgICAgICAgc3RvcmFnZSk7CisKKyAgICAgICAgbXVsdGlSZWZlcmVuY2VTdG9yYWdlLmFkZFJlZmVyZW5jZSgpOworCisgICAgICAgIG11bHRpUmVmZXJlbmNlU3RvcmFnZS5kZWxldGUoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3RvcmFnZS5kZWxldGVkKTsKKworICAgICAgICBtdWx0aVJlZmVyZW5jZVN0b3JhZ2UuZGVsZXRlKCk7CisgICAgICAgIGFzc2VydFRydWUoc3RvcmFnZS5kZWxldGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5wdXRTdHJlYW1PbkRlbGV0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRHVtbXlTdG9yYWdlIHN0b3JhZ2UgPSBuZXcgRHVtbXlTdG9yYWdlKCk7CisgICAgICAgIE11bHRpUmVmZXJlbmNlU3RvcmFnZSBtdWx0aVJlZmVyZW5jZVN0b3JhZ2UgPSBuZXcgTXVsdGlSZWZlcmVuY2VTdG9yYWdlKAorICAgICAgICAgICAgICAgIHN0b3JhZ2UpOworCisgICAgICAgIG11bHRpUmVmZXJlbmNlU3RvcmFnZS5kZWxldGUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbXVsdGlSZWZlcmVuY2VTdG9yYWdlLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFJlZmVyZW5jZU9uRGVsZXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEdW1teVN0b3JhZ2Ugc3RvcmFnZSA9IG5ldyBEdW1teVN0b3JhZ2UoKTsKKyAgICAgICAgTXVsdGlSZWZlcmVuY2VTdG9yYWdlIG11bHRpUmVmZXJlbmNlU3RvcmFnZSA9IG5ldyBNdWx0aVJlZmVyZW5jZVN0b3JhZ2UoCisgICAgICAgICAgICAgICAgc3RvcmFnZSk7CisKKyAgICAgICAgbXVsdGlSZWZlcmVuY2VTdG9yYWdlLmRlbGV0ZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtdWx0aVJlZmVyZW5jZVN0b3JhZ2UuYWRkUmVmZXJlbmNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRHVtbXlTdG9yYWdlIGltcGxlbWVudHMgU3RvcmFnZSB7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGRlbGV0ZWQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZGVsZXRlZCIpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJkdW1teSIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7CisgICAgICAgICAgICBkZWxldGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai9zdG9yYWdlL1N0b3JhZ2VQcm92aWRlclRlc3QuamF2YSBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9TdG9yYWdlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkM2U5NAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovc3RvcmFnZS9TdG9yYWdlUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKgorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlICoKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICAgICAgICAqCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKgorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAgICAgICAgICAgICoKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UgICAqCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCAgICoKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICAqCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKgorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlICAgICoKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgICAgICAqCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGouc3RvcmFnZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuamFtZXMubWltZTRqLmNvZGVjLkNvZGVjVXRpbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworcHVibGljIGNsYXNzIFN0b3JhZ2VQcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVtb3J5U3RvcmFnZVByb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2VQcm92aWRlciBwcm92aWRlciA9IG5ldyBNZW1vcnlTdG9yYWdlUHJvdmlkZXIoKTsKKworICAgICAgICB0ZXN0UmVhZFdyaXRlKHByb3ZpZGVyLCAwKTsKKyAgICAgICAgdGVzdFJlYWRXcml0ZShwcm92aWRlciwgMSk7CisgICAgICAgIHRlc3RSZWFkV3JpdGUocHJvdmlkZXIsIDEwMjQpOworICAgICAgICB0ZXN0UmVhZFdyaXRlKHByb3ZpZGVyLCAyMDAwMCk7CisKKyAgICAgICAgdGVzdERlbGV0ZShwcm92aWRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFRlbXBGaWxlU3RvcmFnZVByb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2VQcm92aWRlciBwcm92aWRlciA9IG5ldyBUZW1wRmlsZVN0b3JhZ2VQcm92aWRlcigpOworCisgICAgICAgIHRlc3RSZWFkV3JpdGUocHJvdmlkZXIsIDApOworICAgICAgICB0ZXN0UmVhZFdyaXRlKHByb3ZpZGVyLCAxKTsKKyAgICAgICAgdGVzdFJlYWRXcml0ZShwcm92aWRlciwgMTAyNCk7CisgICAgICAgIHRlc3RSZWFkV3JpdGUocHJvdmlkZXIsIDIwMDAwKTsKKworICAgICAgICB0ZXN0RGVsZXRlKHByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyZXNob2xkU3RvcmFnZVByb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCB0aHJlc2hvbGQgPSA1MDAwOworICAgICAgICBTdG9yYWdlUHJvdmlkZXIgYmFja2VuZCA9IG5ldyBUZW1wRmlsZVN0b3JhZ2VQcm92aWRlcigpOworICAgICAgICBTdG9yYWdlUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgVGhyZXNob2xkU3RvcmFnZVByb3ZpZGVyKGJhY2tlbmQsCisgICAgICAgICAgICAgICAgdGhyZXNob2xkKTsKKworICAgICAgICB0ZXN0UmVhZFdyaXRlKHByb3ZpZGVyLCAwKTsKKyAgICAgICAgdGVzdFJlYWRXcml0ZShwcm92aWRlciwgMSk7CisgICAgICAgIHRlc3RSZWFkV3JpdGUocHJvdmlkZXIsIHRocmVzaG9sZCAtIDEpOworICAgICAgICB0ZXN0UmVhZFdyaXRlKHByb3ZpZGVyLCB0aHJlc2hvbGQpOworICAgICAgICB0ZXN0UmVhZFdyaXRlKHByb3ZpZGVyLCB0aHJlc2hvbGQgKyAxKTsKKyAgICAgICAgdGVzdFJlYWRXcml0ZShwcm92aWRlciwgMiAqIHRocmVzaG9sZCk7CisgICAgICAgIHRlc3RSZWFkV3JpdGUocHJvdmlkZXIsIDEwICogdGhyZXNob2xkKTsKKworICAgICAgICB0ZXN0RGVsZXRlKHByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lwaGVyU3RvcmFnZVByb3ZpZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2VQcm92aWRlciBiYWNrZW5kID0gbmV3IFRlbXBGaWxlU3RvcmFnZVByb3ZpZGVyKCk7CisgICAgICAgIFN0b3JhZ2VQcm92aWRlciBwcm92aWRlciA9IG5ldyBDaXBoZXJTdG9yYWdlUHJvdmlkZXIoYmFja2VuZCk7CisKKyAgICAgICAgdGVzdFJlYWRXcml0ZShwcm92aWRlciwgMCk7CisgICAgICAgIHRlc3RSZWFkV3JpdGUocHJvdmlkZXIsIDEpOworICAgICAgICB0ZXN0UmVhZFdyaXRlKHByb3ZpZGVyLCAxMDI0KTsKKyAgICAgICAgdGVzdFJlYWRXcml0ZShwcm92aWRlciwgMjAwMDApOworCisgICAgICAgIHRlc3REZWxldGUocHJvdmlkZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVhZFdyaXRlKFN0b3JhZ2VQcm92aWRlciBwcm92aWRlciwgaW50IHNpemUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0U3RvcmUocHJvdmlkZXIsIHNpemUpOworICAgICAgICB0ZXN0Q3JlYXRlU3RvcmFnZU91dHB1dFN0cmVhbShwcm92aWRlciwgc2l6ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTdG9yZShTdG9yYWdlUHJvdmlkZXIgcHJvdmlkZXIsIGludCBzaXplKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBjcmVhdGVEYXRhKHNpemUpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZSwgZGF0YS5sZW5ndGgpOworCisgICAgICAgIFN0b3JhZ2Ugc3RvcmFnZSA9IHByb3ZpZGVyLnN0b3JlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSk7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVjVXRpbC5jb3B5KHN0b3JhZ2UuZ2V0SW5wdXRTdHJlYW0oKSwgYmFvcyk7CisgICAgICAgIHZlcmlmeURhdGEoZGF0YSwgYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENyZWF0ZVN0b3JhZ2VPdXRwdXRTdHJlYW0oU3RvcmFnZVByb3ZpZGVyIHByb3ZpZGVyLAorICAgICAgICAgICAgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gY3JlYXRlRGF0YShzaXplKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIGRhdGEubGVuZ3RoKTsKKworICAgICAgICBTdG9yYWdlT3V0cHV0U3RyZWFtIG91dCA9IHByb3ZpZGVyLmNyZWF0ZVN0b3JhZ2VPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQ29kZWNVdGlsLmNvcHkobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpLCBvdXQpOworICAgICAgICBTdG9yYWdlIHN0b3JhZ2UgPSBvdXQudG9TdG9yYWdlKCk7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvZGVjVXRpbC5jb3B5KHN0b3JhZ2UuZ2V0SW5wdXRTdHJlYW0oKSwgYmFvcyk7CisgICAgICAgIHZlcmlmeURhdGEoZGF0YSwgYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YShieXRlW10gZXhwZWN0ZWQsIGJ5dGVbXSBhY3R1YWwpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgYWN0dWFsLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGNyZWF0ZURhdGEoaW50IHNpemUpIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIGRhdGFbaV0gPSAoYnl0ZSkgaTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdERlbGV0ZShTdG9yYWdlUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2Ugc3RvcmFnZSA9IHByb3ZpZGVyLnN0b3JlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBjcmVhdGVEYXRhKDUxMikpKTsKKworICAgICAgICBzdG9yYWdlLmRlbGV0ZSgpOworCisgICAgICAgIC8vIGdldElucHV0U3RyZWFtIGhhcyB0byB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JhZ2UuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbnZva2luZyBkZWxldGUgYSBzZWNvbmQgdGltZSBzaG91bGQgbm90IGhhdmUgYW55IGVmZmVjdAorICAgICAgICBzdG9yYWdlLmRlbGV0ZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL0NoYXJzZXRVdGlsVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL0NoYXJzZXRVdGlsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmM2U3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvQ2hhcnNldFV0aWxUZXN0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgQ2hhcnNldFV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNXSVNTX0dFUk1BTl9IRUxMTyA9ICJHclwzNzRlemlfelwzNDRtXDM0NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVU1NJQU5fSEVMTE8gPSAiXHUwNDEyXHUwNDQxXHUwNDM1XHUwNDNDX1x1MDQzRlx1MDQ0MFx1MDQzOFx1MDQzMlx1MDQzNVx1MDQ0MiI7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsQVNDSUkoKSB7CisgICAgICAgIFN0cmluZyBzID0gIkxpa2UgaGVsbG8gYW5kIHN0dWZmIjsKKyAgICAgICAgYXNzZXJ0VHJ1ZShDaGFyc2V0VXRpbC5pc0FTQ0lJKHMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uQVNDSUkoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKENoYXJzZXRVdGlsLmlzQVNDSUkoU1dJU1NfR0VSTUFOX0hFTExPKSk7CisgICAgICAgIGFzc2VydEZhbHNlKENoYXJzZXRVdGlsLmlzQVNDSUkoUlVTU0lBTl9IRUxMTykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL01pbWVVdGlsVGVzdC5qYXZhIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL2phbWVzL21pbWU0ai91dGlsL01pbWVVdGlsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNTYzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvTWltZVV0aWxUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgICAqCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgKgorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoKKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgICAqCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICAgICAgICAgICAgKgorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgICAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsICAgKgorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoKKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSAgICAgICAqCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgICAgKgorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgTWltZVV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIHZvaWQgdGVzdEZvbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzIGlzXHJcbiBhIHRlc3QiLCBNaW1lVXRpbC5mb2xkKCJ0aGlzIGlzIGEgdGVzdCIsIDY4KSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhpcyBpc1xyXG4gYSB0ZXN0IiwgTWltZVV0aWwuZm9sZCgidGhpcyBpcyBhIHRlc3QiLCA2OSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoaXNcclxuIGlzIGEgdGVzdCIsIE1pbWVVdGlsLmZvbGQoInRoaXMgaXMgYSB0ZXN0IiwgNzApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzICBcclxuICAgaXMgYSB0ZXN0IiwgTWltZVV0aWwuZm9sZCgKKyAgICAgICAgICAgICAgICAidGhpcyAgICAgaXMgYSB0ZXN0IiwgNzApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9sZE92ZXJseUxvbmdOb25XaGl0ZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBuaW5ldHkgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIKKyAgICAgICAgICAgICAgICArICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCI7CisgICAgICAgIFN0cmluZyBpbnB1dCA9IFN0cmluZy5mb3JtYXQoInRlc3RpbmcgMSAyICVzIHRlc3RpbmcgJXMiLCBuaW5ldHksCisgICAgICAgICAgICAgICAgbmluZXR5KTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJ0ZXN0aW5nIDEgMlxyXG4gJXNcclxuIHRlc3RpbmdcclxuICVzIiwgbmluZXR5LCBuaW5ldHkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgTWltZVV0aWwuZm9sZChpbnB1dCwgMCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmZvbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBNaW1lVXRpbC51bmZvbGQoIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgTWltZVV0aWwudW5mb2xkKCJ4IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiB4ICIsIE1pbWVVdGlsLnVuZm9sZCgiIHggIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgTWltZVV0aWwudW5mb2xkKCJcciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBNaW1lVXRpbC51bmZvbGQoIlxuIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIE1pbWVVdGlsLnVuZm9sZCgiXHJcbiIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCBNaW1lVXRpbC51bmZvbGQoIiBcbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgIiwgTWltZVV0aWwudW5mb2xkKCJcbiAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiICIsIE1pbWVVdGlsLnVuZm9sZCgiIFxyXG4iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiICIsIE1pbWVVdGlsLnVuZm9sZCgiXHJcbiAiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzIGlzIGEgdGVzdCIsIE1pbWVVdGlsLnVuZm9sZCgidGhpcyBpc1xyXG4gYSB0ZXN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRoaXMgaXMgYSB0ZXN0IiwgTWltZVV0aWwudW5mb2xkKCJ0aGlzIGlzXHJcbiBhIHRlc3QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGhpcyBpcyBhIHRlc3QiLCBNaW1lVXRpbC51bmZvbGQoInRoaXNcclxuIGlzIGEgdGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzICAgICBpcyBhIHRlc3QiLCBNaW1lVXRpbAorICAgICAgICAgICAgICAgIC51bmZvbGQoInRoaXMgIFxyXG4gICBpcyBhIHRlc3QiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aGlzIGlzIGEgdGVzdCIsIE1pbWVVdGlsCisgICAgICAgICAgICAgICAgLnVuZm9sZCgidGhpc1xyXG4gaXNcclxuIGFcclxuIHRlc3QiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvU3RyaW5nQXJyYXlNYXBUZXN0LmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvU3RyaW5nQXJyYXlNYXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhjMzAzOQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovdXRpbC9TdHJpbmdBcnJheU1hcFRlc3QuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lICAgKg0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gICAgICAgICoNCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlICAgKg0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgICoNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0ICAgKg0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgICAgICAgICAgICAgICAgICoNCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gICoNCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgICAgICAgKg0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyAgICAgICoNCisgKiB1bmRlciB0aGUgTGljZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5qYW1lcy5taW1lNGoudXRpbDsNCisNCitpbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOw0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsNCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7DQoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCisNCitwdWJsaWMgY2xhc3MgU3RyaW5nQXJyYXlNYXBUZXN0IGV4dGVuZHMgVGVzdENhc2Ugew0KKyAgICBwcml2YXRlIFN0cmluZ0FycmF5TWFwIGdldFNhbXBsZU1hcCgpIHsNCisgICAgICAgIGZpbmFsIFN0cmluZ0FycmF5TWFwIG1hcCA9IG5ldyBTdHJpbmdBcnJheU1hcCgpOw0KKyAgICAgICAgbWFwLmFkZFZhbHVlKCJ4WXoiLCAiYSIpOw0KKyAgICAgICAgbWFwLmFkZFZhbHVlKCJYeXoiLCAiQiIpOw0KKyAgICAgICAgbWFwLmFkZFZhbHVlKCJ4eXoiLCAiYyIpOw0KKyAgICAgICAgbWFwLmFkZFZhbHVlKCJ4cyIsICIxIik7DQorICAgICAgICBtYXAuYWRkVmFsdWUoIlhTIiwgIjIiKTsNCisgICAgICAgIG1hcC5hZGRWYWx1ZSgiZm9vIiwgImJBciIpOw0KKyAgICAgICAgcmV0dXJuIG1hcDsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwKCkgew0KKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nW10+IG1hcCA9IGdldFNhbXBsZU1hcCgpLmdldE1hcCgpOw0KKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGtleXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obWFwLmtleVNldCgpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhrZXlzLnNpemUoKSwgMyk7DQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGtleXMpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBrZXlzLmdldCgwKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInhzIiwga2V5cy5nZXQoMSkpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4eXoiLCBrZXlzLmdldCgyKSk7DQorICAgICAgICBmaW5hbCBTdHJpbmdbXSBmb28gPSBtYXAuZ2V0KCJmb28iKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiYkFyIiwgZm9vWzBdKTsNCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHhzID0gbWFwLmdldCgieHMiKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHhzWzBdKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHhzWzFdKTsNCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHh5eiA9IG1hcC5nZXQoInh5eiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHh5ei5sZW5ndGgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgeHl6WzBdKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiQiIsIHh5elsxXSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCB4eXpbMl0pOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROYW1lQXJyYXkoKSB7DQorICAgICAgICBmaW5hbCBTdHJpbmdbXSBuYW1lcyA9IGdldFNhbXBsZU1hcCgpLmdldE5hbWVBcnJheSgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG5hbWVzLmxlbmd0aCk7DQorICAgICAgICBBcnJheXMuc29ydChuYW1lcyk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVzWzBdKTsNCisgICAgICAgIGFzc2VydEVxdWFscygieHMiLCBuYW1lc1sxXSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoInh5eiIsIG5hbWVzWzJdKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZXMoKSB7DQorICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxTdHJpbmc+IG5hbWVzID0gZ2V0U2FtcGxlTWFwKCkuZ2V0TmFtZXMoKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU3RyaW5nW117ImZvbyIsICJ4cyIsICJ4eXoifSwgbmFtZXMpOw0KKyAgICB9DQorDQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsNCisgICAgICAgIGZpbmFsIFN0cmluZ0FycmF5TWFwIG1hcCA9IGdldFNhbXBsZU1hcCgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiQXIiLCBtYXAuZ2V0VmFsdWUoImZvbyIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiYkFyIiwgbWFwLmdldFZhbHVlKCJGT08iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBtYXAuZ2V0VmFsdWUoInhzIikpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgbWFwLmdldFZhbHVlKCJ4eXoiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBtYXAuZ2V0VmFsdWUoInh5WiIpKTsNCisgICAgICAgIGFzc2VydE51bGwobWFwLmdldFZhbHVlKCJ4eiIpKTsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVzKCkgew0KKyAgICAgICAgZmluYWwgU3RyaW5nQXJyYXlNYXAgbWFwID0gZ2V0U2FtcGxlTWFwKCk7DQorICAgICAgICBmaW5hbCBTdHJpbmdbXSBmb28gPSBtYXAuZ2V0VmFsdWVzKCJmb28iKTsNCisgICAgICAgIGFzc2VydEVxdWFscygxLCBmb28ubGVuZ3RoKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiYkFyIiwgZm9vWzBdKTsNCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIEZPTyA9IG1hcC5nZXRWYWx1ZXMoIkZPTyIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEZPTy5sZW5ndGgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiQXIiLCBGT09bMF0pOw0KKyAgICAgICAgZmluYWwgU3RyaW5nW10geHMgPSBtYXAuZ2V0VmFsdWVzKCJ4cyIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHhzLmxlbmd0aCk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB4c1swXSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCB4c1sxXSk7DQorICAgICAgICBmaW5hbCBTdHJpbmdbXSBYUyA9IG1hcC5nZXRWYWx1ZXMoIlhTIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgWFMubGVuZ3RoKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIFhTWzBdKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIFhTWzFdKTsNCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHh5eiA9IG1hcC5nZXRWYWx1ZXMoInh5eiIpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgeHl6WzBdKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiQiIsIHh5elsxXSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCB4eXpbMl0pOw0KKyAgICAgICAgZmluYWwgU3RyaW5nW10gWFlaID0gbWFwLmdldFZhbHVlcygiWFlaIik7DQorICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBYWVpbMF0pOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCIiwgWFlaWzFdKTsNCisgICAgICAgIGFzc2VydEVxdWFscygiYyIsIFhZWlsyXSk7DQorICAgICAgICBhc3NlcnROdWxsKG1hcC5nZXRWYWx1ZXMoInh6IikpOw0KKyAgICB9DQorDQorICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nW10gcEFycmF5LCBFbnVtZXJhdGlvbjxTdHJpbmc+IHBFbnVtKSB7DQorICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOw0KKyAgICAgICAgd2hpbGUgKHBFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7DQorICAgICAgICAgICAgbGlzdC5hZGQocEVudW0ubmV4dEVsZW1lbnQoKSk7DQorICAgICAgICB9DQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIENvbGxhdG9yLmdldEluc3RhbmNlKExvY2FsZS5VUykpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBBcnJheS5sZW5ndGgsIGxpc3Quc2l6ZSgpKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyAgaSA8IHBBcnJheS5sZW5ndGg7ICBpKyspIHsNCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocEFycmF5W2ldLCBsaXN0LmdldChpKSk7DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcHVibGljIHZvaWQgdGVzdEdldFZhbHVlRW51bSgpIHsNCisgICAgICAgIGZpbmFsIFN0cmluZ0FycmF5TWFwIG1hcCA9IGdldFNhbXBsZU1hcCgpOw0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmdbXXsiYkFyIn0sIG1hcC5nZXRWYWx1ZUVudW0oImZvbyIpKTsNCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgU3RyaW5nW117ImJBciJ9LCBtYXAuZ2V0VmFsdWVFbnVtKCJGT08iKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdeyIxIiwgIjIifSwgbWFwLmdldFZhbHVlRW51bSgieHMiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdeyIxIiwgIjIifSwgbWFwLmdldFZhbHVlRW51bSgiWHMiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdeyJhIiwgIkIiLCAiYyJ9LCBtYXAuZ2V0VmFsdWVFbnVtKCJ4eXoiKSk7DQorICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZ1tdeyJhIiwgIkIiLCAiYyJ9LCBtYXAuZ2V0VmFsdWVFbnVtKCJYWVoiKSk7DQorICAgICAgICBhc3NlcnROdWxsKG1hcC5nZXRWYWx1ZXMoInh6IikpOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9qYW1lcy9taW1lNGovdXRpbC9UZXN0Qnl0ZUFycmF5QnVmZmVyLmphdmEgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvVGVzdEJ5dGVBcnJheUJ1ZmZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTc5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvamFtZXMvbWltZTRqL3V0aWwvVGVzdEJ5dGVBcnJheUJ1ZmZlci5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSAgICoKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSAqCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAgICAgICAgKgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSAgICoKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgICAgICAgICAgICAqCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlICAgKgorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAgICAgICAgICAgICAgICAgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgICAqCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAgKgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZICAgICAgICoKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSAgICAqCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zICAgICAgKgorICogdW5kZXIgdGhlIExpY2Vuc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuamFtZXMubWltZTRqLnV0aWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmphbWVzLm1pbWU0ai51dGlsLkJ5dGVBcnJheUJ1ZmZlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgQnl0ZUFycmF5QnVmZmVyfS4KKyAqLworcHVibGljIGNsYXNzIFRlc3RCeXRlQXJyYXlCdWZmZXIgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5QnVmZmVyIGJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlCdWZmZXIoMTYpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTYsIGJ1ZmZlci5jYXBhY2l0eSgpKTsgCisgICAgICAgIGFzc2VydEVxdWFscygwLCBidWZmZXIubGVuZ3RoKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGJ1ZmZlci5idWZmZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxNiwgYnVmZmVyLmJ1ZmZlcigpLmxlbmd0aCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5QnVmZmVyKC0xKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUFwcGVuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYnVmZmVyID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcigxNik7CisgICAgICAgIGFzc2VydEVxdWFscygxNiwgYnVmZmVyLmNhcGFjaXR5KCkpOyAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGJ1ZmZlci5sZW5ndGgoKSk7CisgICAgICAgIGJ5dGVbXSBiMSA9IGJ1ZmZlci50b0J5dGVBcnJheSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGIxLmxlbmd0aCk7CisgICAgICAgIGFzc2VydFRydWUoYnVmZmVyLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGJ1ZmZlci5pc0Z1bGwoKSk7CisgICAgICAgIAorICAgICAgICBieXRlW10gdG1wID0gbmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDR9OworICAgICAgICBidWZmZXIuYXBwZW5kKHRtcCwgMCwgdG1wLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygxNiwgYnVmZmVyLmNhcGFjaXR5KCkpOyAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGJ1ZmZlci5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGJ1ZmZlci5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRGYWxzZShidWZmZXIuaXNGdWxsKCkpOworICAgICAgICAKKyAgICAgICAgYnl0ZVtdIGIyID0gYnVmZmVyLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYjIpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgYjIubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0bXAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0bXBbaV0sIGIyW2ldKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0bXBbaV0sIGJ1ZmZlci5ieXRlQXQoaSkpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTYsIGJ1ZmZlci5jYXBhY2l0eSgpKTsgCisgICAgICAgIGFzc2VydEVxdWFscygwLCBidWZmZXIubGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRUcnVlKGJ1ZmZlci5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRGYWxzZShidWZmZXIuaXNGdWxsKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwYW5kQXBwZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBidWZmZXIgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgYnVmZmVyLmNhcGFjaXR5KCkpOyAKKyAgICAgICAgCisgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtdIHsgMSwgMiwgMywgNH07CisgICAgICAgIGJ1ZmZlci5hcHBlbmQodG1wLCAwLCAyKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0bXAsIDAsIDQpOworICAgICAgICBidWZmZXIuYXBwZW5kKHRtcCwgMCwgMCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDgsIGJ1ZmZlci5jYXBhY2l0eSgpKTsgCisgICAgICAgIGFzc2VydEVxdWFscyg2LCBidWZmZXIubGVuZ3RoKCkpOworICAgICAgICAKKyAgICAgICAgYnVmZmVyLmFwcGVuZCh0bXAsIDAsIDQpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE2LCBidWZmZXIuY2FwYWNpdHkoKSk7IAorICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGJ1ZmZlci5sZW5ndGgoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXBwZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBidWZmZXIgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDQpOworICAgICAgICBidWZmZXIuYXBwZW5kKChieXRlW10pbnVsbCwgMCwgMCk7CisKKyAgICAgICAgYnl0ZVtdIHRtcCA9IG5ldyBieXRlW10geyAxLCAyLCAzLCA0fTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodG1wLCAtMSwgMCk7CisgICAgICAgICAgICBmYWlsKCJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodG1wLCAwLCAtMSk7CisgICAgICAgICAgICBmYWlsKCJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodG1wLCAwLCA4KTsKKyAgICAgICAgICAgIGZhaWwoIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh0bXAsIDEwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBmYWlsKCJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQodG1wLCAyLCA0KTsKKyAgICAgICAgICAgIGZhaWwoIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRPbmVCeXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBidWZmZXIgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgYnVmZmVyLmNhcGFjaXR5KCkpOyAKKyAgICAgICAgCisgICAgICAgIGJ5dGVbXSB0bXAgPSBuZXcgYnl0ZVtdIHsgMSwgMTI3LCAtMSwgLTEyOCwgMSwgLTJ9OworICAgICAgICBmb3IgKGJ5dGUgYiA6IHRtcCkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoOCwgYnVmZmVyLmNhcGFjaXR5KCkpOyAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGJ1ZmZlci5sZW5ndGgoKSk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRtcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRtcFtpXSwgYnVmZmVyLmJ5dGVBdChpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFNldExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlCdWZmZXIgYnVmZmVyID0gbmV3IEJ5dGVBcnJheUJ1ZmZlcig0KTsKKyAgICAgICAgYnVmZmVyLnNldExlbmd0aCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1ZmZlci5sZW5ndGgoKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRJbnZhbGlkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUJ1ZmZlciBidWZmZXIgPSBuZXcgQnl0ZUFycmF5QnVmZmVyKDQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVmZmVyLnNldExlbmd0aCgtMik7CisgICAgICAgICAgICBmYWlsKCJJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1ZmZlci5zZXRMZW5ndGgoMjAwKTsKKyAgICAgICAgICAgIGZhaWwoIkluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKyAgICAKK30KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYWQtbmV3bGluZXMtbXVsdGlwbGUtcGFydHMtYmFzZTY0Lm1zZyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYWQtbmV3bGluZXMtbXVsdGlwbGUtcGFydHMtYmFzZTY0Lm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjRmMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0cy1iYXNlNjQubXNnCkBAIC0wLDAgKzEsMTEgQEAKK0NvbnRlbnQtdHlwZTogbWVzc2FnZS9yZmM4MjINCitDb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOiBiYXNlNjQNCitTdWJqZWN0OiBhIG11bHRpcGFydCBtZXNzYWdlL3JmYzgyMiB3aGljaCBoYXMgYmVlbiBiYXNlNjQtZW5jb2RlZA0KKw0KK1EyOXVkR1Z1ZEMxVWVYQmxPaUJ0ZFd4MGFYQmhjblF2YldsNFpXUTdJR0p2ZFc1a1lYSjVQU0l0TFMwdExTMHRMUzB0TFMweU9UbEINCitOekJDTXpNNVFqWTFRVGt6TlRReVJESkJSU0lLQ2xSb2FYTWdhWE1nWVNCdGRXeDBhUzF3WVhKMElHMWxjM05oWjJVZ2FXNGdUVWxODQorUlNCbWIzSnRZWFF1Q2dvdExTMHRMUzB0TFMwdExTMHRMVEk1T1VFM01FSXpNemxDTmpWQk9UTTFOREpFTWtGRkNrTnZiblJsYm5RdA0KK1ZIbHdaVG9nZEdWNGRDOXdiR0ZwYmpzZ1kyaGhjbk5sZEQxMWN5MWhjMk5wYVFwRGIyNTBaVzUwTFZSeVlXNXpabVZ5TFVWdVkyOWsNCithVzVuT2lBM1ltbDBDZ3BVWlhoMElHSnZaSGtLQ2kwdExTMHRMUzB0TFMwdExTMHRNams1UVRjd1FqTXpPVUkyTlVFNU16VTBNa1F5DQorUVVVdExRcFVhR0YwSUhkaGN5QmhJRzExYkhScExYQmhjblFnYldWemMyRm5aU0JwYmlCTlNVMUZJR1p2Y20xaGRDNEsNCisNCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLWJhc2U2NC5vdXQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLWJhc2U2NC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhZDE2NgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYWQtbmV3bGluZXMtbXVsdGlwbGUtcGFydHMtYmFzZTY0Lm91dApAQCAtMCwwICsxLDExIEBACitDb250ZW50LXR5cGU6IG1lc3NhZ2UvcmZjODIyDQorQ29udGVudC10cmFuc2Zlci1lbmNvZGluZzogYmFzZTY0DQorU3ViamVjdDogYSBtdWx0aXBhcnQgbWVzc2FnZS9yZmM4MjIgd2hpY2ggaGFzIGJlZW4gYmFzZTY0LWVuY29kZWQNCisNCitRMjl1ZEdWdWRDMVVlWEJsT2lCdGRXeDBhWEJoY25RdmJXbDRaV1E3SUdKdmRXNWtZWEo1UFNJdExTMHRMUzB0TFMwdExTMHlPVGxCDQorTnpCQ016TTVRalkxUVRrek5UUXlSREpCUlNJTkNnMEtWR2hwY3lCcGN5QmhJRzExYkhScExYQmhjblFnYldWemMyRm5aU0JwYmlCTg0KK1NVMUZJR1p2Y20xaGRDNEtEUW90TFMwdExTMHRMUzB0TFMwdExUSTVPVUUzTUVJek16bENOalZCT1RNMU5ESkVNa0ZGRFFwRGIyNTANCitaVzUwTFZSNWNHVTZJSFJsZUhRdmNHeGhhVzQ3SUdOb1lYSnpaWFE5ZFhNdFlYTmphV2tOQ2tOdmJuUmxiblF0VkhKaGJuTm1aWEl0DQorUlc1amIyUnBibWM2SURkaWFYUU5DZzBLVkdWNGRDQmliMlI1Q2cwS0xTMHRMUzB0TFMwdExTMHRMUzB5T1RsQk56QkNNek01UWpZMQ0KK1FUa3pOVFF5UkRKQlJTMHREUXBVYUdGMElIZGhjeUJoSUcxMWJIUnBMWEJoY25RZ2JXVnpjMkZuWlNCcGJpQk5TVTFGSUdadmNtMWgNCitkQzRLDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0cy1iYXNlNjQueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0cy1iYXNlNjQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDAzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLWJhc2U2NC54bWwKQEAgLTAsMCArMSwzNSBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC10eXBlOiBtZXNzYWdlL3JmYzgyMjwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6IGJhc2U2NDwvZmllbGQ+DQorPGZpZWxkPg0KK1N1YmplY3Q6IGEgbXVsdGlwYXJ0IG1lc3NhZ2UvcmZjODIyIHdoaWNoIGhhcyBiZWVuIGJhc2U2NC1lbmNvZGVkPC9maWVsZD4NCis8L2hlYWRlcj4NCis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitUZXh0IGJvZHkKKzwvYm9keT4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorVGhhdCB3YXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCis8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0cy1iYXNlNjRfZGVjb2RlZC54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLWJhc2U2NF9kZWNvZGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjE5ZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0cy1iYXNlNjRfZGVjb2RlZC54bWwKQEAgLTAsMCArMSwzMyBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC10eXBlOiBtZXNzYWdlL3JmYzgyMjwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6IGJhc2U2NDwvZmllbGQ+DQorPGZpZWxkPg0KK1N1YmplY3Q6IGEgbXVsdGlwYXJ0IG1lc3NhZ2UvcmZjODIyIHdoaWNoIGhhcyBiZWVuIGJhc2U2NC1lbmNvZGVkPC9maWVsZD4NCis8L2hlYWRlcj4NCis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8dGV4dC1ib2R5IG5hbWU9ImJhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0cy1iYXNlNjRfZGVjb2RlZF8xXzFfMS50eHQiLz4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorVGhhdCB3YXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCis8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0cy1iYXNlNjRfZGVjb2RlZF8xXzFfMS50eHQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLWJhc2U2NF9kZWNvZGVkXzFfMV8xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjYyOGYzCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0cy1iYXNlNjRfZGVjb2RlZF8xXzFfMS50eHQKQEAgLTAsMCArMSBAQAorVGV4dCBib2R5CmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLm1zZyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYWQtbmV3bGluZXMtbXVsdGlwbGUtcGFydHMubXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODU0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLm1zZwpAQCAtMCwwICsxLDEyIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorCistLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworVGV4dCBib2R5CisKKy0tLS0tLS0tLS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQyQUUtLQorVGhhdCB3YXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLm91dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYWQtbmV3bGluZXMtbXVsdGlwbGUtcGFydHMub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODQ5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLm91dApAQCAtMCwwICsxLDEyIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFIg0KKw0KK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCisNCistLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFDQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdA0KKw0KK1RleHQgYm9keQorDQorLS0tLS0tLS0tLS0tLS0yOTlBNzBCMzM5QjY1QTkzNTQyRDJBRS0tDQorVGhhdCB3YXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYWQtbmV3bGluZXMtbXVsdGlwbGUtcGFydHMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjhmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzLnhtbApAQCAtMCwwICsxLDI1IEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitUZXh0IGJvZHkKKzwvYm9keT4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorVGhhdCB3YXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCis8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzX2RlY29kZWQueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0c19kZWNvZGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjRhMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2JhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0c19kZWNvZGVkLnhtbApAQCAtMCwwICsxLDIzIEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8dGV4dC1ib2R5IG5hbWU9ImJhZC1uZXdsaW5lcy1tdWx0aXBsZS1wYXJ0c19kZWNvZGVkXzFfMS50eHQiLz4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorVGhhdCB3YXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCis8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzX2RlY29kZWRfMV8xLnR4dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYWQtbmV3bGluZXMtbXVsdGlwbGUtcGFydHNfZGVjb2RlZF8xXzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNjI4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFkLW5ld2xpbmVzLW11bHRpcGxlLXBhcnRzX2RlY29kZWRfMV8xLnR4dApAQCAtMCwwICsxIEBACitUZXh0IGJvZHkKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjQtZW5jb2RlZC10ZXh0Lm1zZyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjQtZW5jb2RlZC10ZXh0Lm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZiYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NC1lbmNvZGVkLXRleHQubXNnCkBAIC0wLDAgKzEsMTEgQEAKK0NvbnRlbnQtdHlwZTogdGV4dC9wbGFpbg0KK0NvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6IGJhc2U2NA0KK1N1YmplY3Q6IGEgbXVsdGlwYXJ0IG1lc3NhZ2UvcmZjODIyIHdoaWNoIGhhcyBiZWVuIGJhc2U2NC1lbmNvZGVkIGFzIHBsYWluIHRleHQNCisNCitRMjl1ZEdWdWRDMVVlWEJsT2lCdGRXeDBhWEJoY25RdmJXbDRaV1E3SUdKdmRXNWtZWEo1UFNJdExTMHRMUzB0TFMwdExTMHlPVGxCDQorTnpCQ016TTVRalkxUVRrek5UUXlSREpCUlNJS0NsUm9hWE1nYVhNZ1lTQnRkV3gwYVMxd1lYSjBJRzFsYzNOaFoyVWdhVzRnVFVsTg0KK1JTQm1iM0p0WVhRdUNnb3RMUzB0TFMwdExTMHRMUzB0TFRJNU9VRTNNRUl6TXpsQ05qVkJPVE0xTkRKRU1rRkZDa052Ym5SbGJuUXQNCitWSGx3WlRvZ2RHVjRkQzl3YkdGcGJqc2dZMmhoY25ObGREMTFjeTFoYzJOcGFRcERiMjUwWlc1MExWUnlZVzV6Wm1WeUxVVnVZMjlrDQorYVc1bk9pQTNZbWwwQ2dwVVpYaDBJR0p2WkhrS0NpMHRMUzB0TFMwdExTMHRMUzB0TWprNVFUY3dRak16T1VJMk5VRTVNelUwTWtReQ0KK1FVVXRMUXBVYUdGMElIZGhjeUJoSUcxMWJIUnBMWEJoY25RZ2JXVnpjMkZuWlNCcGJpQk5TVTFGSUdadmNtMWhkQzRLDQorDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NC1lbmNvZGVkLXRleHQub3V0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NC1lbmNvZGVkLXRleHQub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0M2Y0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0LWVuY29kZWQtdGV4dC5vdXQKQEAgLTAsMCArMSwxMCBAQAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluDQorQ29udGVudC10cmFuc2Zlci1lbmNvZGluZzogYmFzZTY0DQorU3ViamVjdDogYSBtdWx0aXBhcnQgbWVzc2FnZS9yZmM4MjIgd2hpY2ggaGFzIGJlZW4gYmFzZTY0LWVuY29kZWQgYXMgcGxhaW4gdGV4dA0KKw0KK1EyOXVkR1Z1ZEMxVWVYQmxPaUJ0ZFd4MGFYQmhjblF2YldsNFpXUTdJR0p2ZFc1a1lYSjVQU0l0TFMwdExTMHRMUzB0TFMweU9UbEINCitOekJDTXpNNVFqWTFRVGt6TlRReVJESkJSU0lLQ2xSb2FYTWdhWE1nWVNCdGRXeDBhUzF3WVhKMElHMWxjM05oWjJVZ2FXNGdUVWxODQorUlNCbWIzSnRZWFF1Q2dvdExTMHRMUzB0TFMwdExTMHRMVEk1T1VFM01FSXpNemxDTmpWQk9UTTFOREpFTWtGRkNrTnZiblJsYm5RdA0KK1ZIbHdaVG9nZEdWNGRDOXdiR0ZwYmpzZ1kyaGhjbk5sZEQxMWN5MWhjMk5wYVFwRGIyNTBaVzUwTFZSeVlXNXpabVZ5TFVWdVkyOWsNCithVzVuT2lBM1ltbDBDZ3BVWlhoMElHSnZaSGtLQ2kwdExTMHRMUzB0TFMwdExTMHRNams1UVRjd1FqTXpPVUkyTlVFNU16VTBNa1F5DQorUVVVdExRcFVhR0YwSUhkaGN5QmhJRzExYkhScExYQmhjblFnYldWemMyRm5aU0JwYmlCTlNVMUZJR1p2Y20xaGRDNEsNCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0LWVuY29kZWQtdGV4dC54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0LWVuY29kZWQtdGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4N2UwYQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjQtZW5jb2RlZC10ZXh0LnhtbApAQCAtMCwwICsxLDE5IEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LXR5cGU6IHRleHQvcGxhaW48L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOiBiYXNlNjQ8L2ZpZWxkPg0KKzxmaWVsZD4NCitTdWJqZWN0OiBhIG11bHRpcGFydCBtZXNzYWdlL3JmYzgyMiB3aGljaCBoYXMgYmVlbiBiYXNlNjQtZW5jb2RlZCBhcyBwbGFpbiB0ZXh0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitRMjl1ZEdWdWRDMVVlWEJsT2lCdGRXeDBhWEJoY25RdmJXbDRaV1E3SUdKdmRXNWtZWEo1UFNJdExTMHRMUzB0TFMwdExTMHlPVGxCDQorTnpCQ016TTVRalkxUVRrek5UUXlSREpCUlNJS0NsUm9hWE1nYVhNZ1lTQnRkV3gwYVMxd1lYSjBJRzFsYzNOaFoyVWdhVzRnVFVsTg0KK1JTQm1iM0p0WVhRdUNnb3RMUzB0TFMwdExTMHRMUzB0TFRJNU9VRTNNRUl6TXpsQ05qVkJPVE0xTkRKRU1rRkZDa052Ym5SbGJuUXQNCitWSGx3WlRvZ2RHVjRkQzl3YkdGcGJqc2dZMmhoY25ObGREMTFjeTFoYzJOcGFRcERiMjUwWlc1MExWUnlZVzV6Wm1WeUxVVnVZMjlrDQorYVc1bk9pQTNZbWwwQ2dwVVpYaDBJR0p2WkhrS0NpMHRMUzB0TFMwdExTMHRMUzB0TWprNVFUY3dRak16T1VJMk5VRTVNelUwTWtReQ0KK1FVVXRMUXBVYUdGMElIZGhjeUJoSUcxMWJIUnBMWEJoY25RZ2JXVnpjMkZuWlNCcGJpQk5TVTFGSUdadmNtMWhkQzRLDQorDQorPC9ib2R5Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0LWVuY29kZWQtdGV4dF9kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjQtZW5jb2RlZC10ZXh0X2RlY29kZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYTZkODkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0LWVuY29kZWQtdGV4dF9kZWNvZGVkLnhtbApAQCAtMCwwICsxLDExIEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LXR5cGU6IHRleHQvcGxhaW48L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOiBiYXNlNjQ8L2ZpZWxkPg0KKzxmaWVsZD4NCitTdWJqZWN0OiBhIG11bHRpcGFydCBtZXNzYWdlL3JmYzgyMiB3aGljaCBoYXMgYmVlbiBiYXNlNjQtZW5jb2RlZCBhcyBwbGFpbiB0ZXh0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8dGV4dC1ib2R5IG5hbWU9ImJhc2U2NC1lbmNvZGVkLXRleHRfZGVjb2RlZF8xLnR4dCIvPg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0LWVuY29kZWQtdGV4dF9kZWNvZGVkXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NC1lbmNvZGVkLXRleHRfZGVjb2RlZF8xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDg1NDkwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NC1lbmNvZGVkLXRleHRfZGVjb2RlZF8xLnR4dApAQCAtMCwwICsxLDEyIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorCistLS0tLS0tLS0tLS0tLTI5OUE3MEIzMzlCNjVBOTM1NDJEMkFFCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworVGV4dCBib2R5CisKKy0tLS0tLS0tLS0tLS0tMjk5QTcwQjMzOUI2NUE5MzU0MkQyQUUtLQorVGhhdCB3YXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLW5lc3RlZC5tc2cgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLW5lc3RlZC5tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3NGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UtbmVzdGVkLm1zZwpAQCAtMCwwICsxLDExIEBACitNSU1FLVZlcnNpb246IDEuMA0KK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjINCitTdWJqZWN0OiB0aGUgYm9keSBpcyBhIGJhc2U2NCBlbmNvZGUgcmZjODIyIG1lc3NhZ2UgaW5jbHVkaW5nIGFub3RoZXIgYmFzZTY0IGVuY29kZWQgcmZjODIyIG1lc3NhZ2UNCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQNCisNCitUVWxOUlMxV1pYSnphVzl1T2lBeExqQU5DbE4xWW1wbFkzUTZJR0VnYzJsdGNHeGxJSEptWXpneU1pQnRaWE56WVdkbElHVnVZMjlrDQorWldRZ2FXNGdZU0JpWVhObE5qUWdZbTlrZVM0TkNrTnZiblJsYm5RdFZIbHdaVG9nYldWemMyRm5aUzl5Wm1NNE1qSU5Da052Ym5SbA0KK2JuUXRWSEpoYm5ObVpYSXRSVzVqYjJScGJtYzZJR0poYzJVMk5BMEtEUXBSTWpsMVpFZFdkV1JETVZWbFdFSnNUMmxDTUZwWWFEQk0NCitNMEp6V1Zkc2RVOTVRbXBoUjBaNVl6SldNRkJZVm5wTVYwWjZXVEpzY0VSUmNFUmlNalV3V2xjMU1FeFdVbmxaVnpWNkRRcGFiVlo1DQorVEZWV2RWa3lPV3RoVnpWdVQybEJNMWx0YkRCRVVXOU9RMnhTYkdWSVVXZFpiVGxyWlZGdlRrTm5QVDBOQ2cwSw0KKw0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UtbmVzdGVkLm91dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UtbmVzdGVkLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDg3YTA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NGVuY29kZWQtcmZjODIybWVzc2FnZS1uZXN0ZWQub3V0CkBAIC0wLDAgKzEsMTAgQEAKK01JTUUtVmVyc2lvbjogMS4wDQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMg0KK1N1YmplY3Q6IHRoZSBib2R5IGlzIGEgYmFzZTY0IGVuY29kZSByZmM4MjIgbWVzc2FnZSBpbmNsdWRpbmcgYW5vdGhlciBiYXNlNjQgZW5jb2RlZCByZmM4MjIgbWVzc2FnZQ0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NA0KKw0KK1RVbE5SUzFXWlhKemFXOXVPaUF4TGpBTkNsTjFZbXBsWTNRNklHRWdjMmx0Y0d4bElISm1Zemd5TWlCdFpYTnpZV2RsSUdWdVkyOWsNCitaV1FnYVc0Z1lTQmlZWE5sTmpRZ1ltOWtlUzROQ2tOdmJuUmxiblF0Vkhsd1pUb2diV1Z6YzJGblpTOXlabU00TWpJTkNrTnZiblJsDQorYm5RdFZISmhibk5tWlhJdFJXNWpiMlJwYm1jNklHSmhjMlUyTkEwS0RRcFJNamwxWkVkV2RXUkRNVlZsV0VKc1QybENNRnBZYURCTQ0KK00wSnpXVmRzZFU5NVFtcGhSMFo1WXpKV01GQllWbnBNVjBaNldUSnNjRVJSY0VSaU1qVXdXbGMxTUV4V1VubFpWelY2RFFwYWJWWjUNCitURlZXZFZreU9XdGhWelZ1VDJsQk0xbHRiREJFVVc5T1EyeFNiR1ZJVVdkWmJUbHJaVkZ2VGtOblBUME5DZz09DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NGVuY29kZWQtcmZjODIybWVzc2FnZS1uZXN0ZWQueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NGVuY29kZWQtcmZjODIybWVzc2FnZS1uZXN0ZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZDhjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLW5lc3RlZC54bWwKQEAgLTAsMCArMSwzNiBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorTUlNRS1WZXJzaW9uOiAxLjA8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogdGhlIGJvZHkgaXMgYSBiYXNlNjQgZW5jb2RlIHJmYzgyMiBtZXNzYWdlIGluY2x1ZGluZyBhbm90aGVyIGJhc2U2NCBlbmNvZGVkIHJmYzgyMiBtZXNzYWdlPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitNSU1FLVZlcnNpb246IDEuMDwvZmllbGQ+DQorPGZpZWxkPg0KK1N1YmplY3Q6IGEgc2ltcGxlIHJmYzgyMiBtZXNzYWdlIGVuY29kZWQgaW4gYSBiYXNlNjQgYm9keS48L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitUZXh0IGJvZHkKKw0KKzwvYm9keT4NCis8L21lc3NhZ2U+DQorPC9tZXNzYWdlPg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLW5lc3RlZF9kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UtbmVzdGVkX2RlY29kZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYmE0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLW5lc3RlZF9kZWNvZGVkLnhtbApAQCAtMCwwICsxLDMzIEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitNSU1FLVZlcnNpb246IDEuMDwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjI8L2ZpZWxkPg0KKzxmaWVsZD4NCitTdWJqZWN0OiB0aGUgYm9keSBpcyBhIGJhc2U2NCBlbmNvZGUgcmZjODIyIG1lc3NhZ2UgaW5jbHVkaW5nIGFub3RoZXIgYmFzZTY0IGVuY29kZWQgcmZjODIyIG1lc3NhZ2U8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK01JTUUtVmVyc2lvbjogMS4wPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogYSBzaW1wbGUgcmZjODIyIG1lc3NhZ2UgZW5jb2RlZCBpbiBhIGJhc2U2NCBib2R5LjwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjI8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0iYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLW5lc3RlZF9kZWNvZGVkXzFfMV8xLnR4dCIvPg0KKzwvbWVzc2FnZT4NCis8L21lc3NhZ2U+DQorPC9tZXNzYWdlPg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UtbmVzdGVkX2RlY29kZWRfMV8xXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NGVuY29kZWQtcmZjODIybWVzc2FnZS1uZXN0ZWRfZGVjb2RlZF8xXzFfMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3NmNmNAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UtbmVzdGVkX2RlY29kZWRfMV8xXzEudHh0CkBAIC0wLDAgKzEsMiBAQAorVGV4dCBib2R5CisNCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLm1zZyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UubXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNGNlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLm1zZwpAQCAtMCwwICsxLDggQEAKK01JTUUtVmVyc2lvbjogMS4wDQorU3ViamVjdDogYSBzaW1wbGUgcmZjODIyIG1lc3NhZ2UgZW5jb2RlZCBpbiBhIGJhc2U2NCBib2R5Lg0KK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjINCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQNCisNCitRMjl1ZEdWdWRDMVVlWEJsT2lCMFpYaDBMM0JzWVdsdU95QmphR0Z5YzJWMFBYVnpMV0Z6WTJscERRcERiMjUwWlc1MExWUnlZVzV6DQorWm1WeUxVVnVZMjlrYVc1bk9pQTNZbWwwRFFvTkNsUmxlSFFnWW05a2VRb05DZz09DQorDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NGVuY29kZWQtcmZjODIybWVzc2FnZS5vdXQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGUzNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NGVuY29kZWQtcmZjODIybWVzc2FnZS5vdXQKQEAgLTAsMCArMSw3IEBACitNSU1FLVZlcnNpb246IDEuMA0KK1N1YmplY3Q6IGEgc2ltcGxlIHJmYzgyMiBtZXNzYWdlIGVuY29kZWQgaW4gYSBiYXNlNjQgYm9keS4NCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQorDQorUTI5dWRHVnVkQzFVZVhCbE9pQjBaWGgwTDNCc1lXbHVPeUJqYUdGeWMyVjBQWFZ6TFdGelkybHBEUXBEYjI1MFpXNTBMVlJ5WVc1eg0KK1ptVnlMVVZ1WTI5a2FXNW5PaUEzWW1sMERRb05DbFJsZUhRZ1ltOWtlUW9OQ2c9PQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NGVuY29kZWQtcmZjODIybWVzc2FnZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllNWUwZgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2UueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK01JTUUtVmVyc2lvbjogMS4wPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogYSBzaW1wbGUgcmZjODIyIG1lc3NhZ2UgZW5jb2RlZCBpbiBhIGJhc2U2NCBib2R5LjwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjI8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK1RleHQgYm9keQorDQorPC9ib2R5Pg0KKzwvbWVzc2FnZT4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2U2NGVuY29kZWQtcmZjODIybWVzc2FnZV9kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2VfZGVjb2RlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ3NTE2NAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2VfZGVjb2RlZC54bWwKQEAgLTAsMCArMSwyMSBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorTUlNRS1WZXJzaW9uOiAxLjA8L2ZpZWxkPg0KKzxmaWVsZD4NCitTdWJqZWN0OiBhIHNpbXBsZSByZmM4MjIgbWVzc2FnZSBlbmNvZGVkIGluIGEgYmFzZTY0IGJvZHkuPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMjwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NDwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdDwvZmllbGQ+DQorPC9oZWFkZXI+DQorPHRleHQtYm9keSBuYW1lPSJiYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2VfZGVjb2RlZF8xXzEudHh0Ii8+DQorPC9tZXNzYWdlPg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlX2RlY29kZWRfMV8xLnR4dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNlNjRlbmNvZGVkLXJmYzgyMm1lc3NhZ2VfZGVjb2RlZF8xXzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzZjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzZTY0ZW5jb2RlZC1yZmM4MjJtZXNzYWdlX2RlY29kZWRfMV8xLnR4dApAQCAtMCwwICsxLDIgQEAKK1RleHQgYm9keQorDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXZlcnktbG9uZy1saW5lcy5tc2cgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4tdmVyeS1sb25nLWxpbmVzLm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RlNmMxCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXZlcnktbG9uZy1saW5lcy5tc2cKQEAgLTAsMCArMSwxMyBAQAorUmV0dXJuLVBhdGg6IGZvb0BleGFtcGxlLmNvbQ0KK1N1YmplY3Q6IFNpbXBsZSBTdWJqZWN0DQorRnJvbTogZm9vQGV4YW1wbGUuY29tDQorVG86IGJhckBleGFtcGxlLmNvbQ0KK0NjOiByZWNpcGllbnQxQGV4YW1wbGUuY29tLHJlY2lwaWVudDJAZXhhbXBsZS5jb20sIGxvY2FscmVjaXBpZW50DQorRGF0ZTogV2VkLCAxMSBGZWIgOTggMTE6NTEgQ1NUDQorDQorVGhpcyBpcyBhIHZlcnkgc2ltcGxlIG1lc3NhZ2Ugd2l0aCBhIHNpbXBsZSBib2R5IGFuZCBubyB3ZWlyZCB0aGluZ3MgYXQgDQorYWxsLg0KKw0KK3RoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIA0KKw0KK0RvbmUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXZlcnktbG9uZy1saW5lcy5vdXQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4tdmVyeS1sb25nLWxpbmVzLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2RlNmMxCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXZlcnktbG9uZy1saW5lcy5vdXQKQEAgLTAsMCArMSwxMyBAQAorUmV0dXJuLVBhdGg6IGZvb0BleGFtcGxlLmNvbQ0KK1N1YmplY3Q6IFNpbXBsZSBTdWJqZWN0DQorRnJvbTogZm9vQGV4YW1wbGUuY29tDQorVG86IGJhckBleGFtcGxlLmNvbQ0KK0NjOiByZWNpcGllbnQxQGV4YW1wbGUuY29tLHJlY2lwaWVudDJAZXhhbXBsZS5jb20sIGxvY2FscmVjaXBpZW50DQorRGF0ZTogV2VkLCAxMSBGZWIgOTggMTE6NTEgQ1NUDQorDQorVGhpcyBpcyBhIHZlcnkgc2ltcGxlIG1lc3NhZ2Ugd2l0aCBhIHNpbXBsZSBib2R5IGFuZCBubyB3ZWlyZCB0aGluZ3MgYXQgDQorYWxsLg0KKw0KK3RoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIHRoaXMgaXMgYSB2ZXJ5IHZlcnkgbG9uZyBsaW5lIA0KKw0KK0RvbmUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXZlcnktbG9uZy1saW5lcy54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4tdmVyeS1sb25nLWxpbmVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODNiYzNhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXZlcnktbG9uZy1saW5lcy54bWwKQEAgLTAsMCArMSwyMyBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorUmV0dXJuLVBhdGg6IGZvb0BleGFtcGxlLmNvbTwvZmllbGQ+DQorPGZpZWxkPg0KK1N1YmplY3Q6IFNpbXBsZSBTdWJqZWN0PC9maWVsZD4NCis8ZmllbGQ+DQorRnJvbTogZm9vQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorVG86IGJhckBleGFtcGxlLmNvbTwvZmllbGQ+DQorPGZpZWxkPg0KK0NjOiByZWNpcGllbnQxQGV4YW1wbGUuY29tLHJlY2lwaWVudDJAZXhhbXBsZS5jb20sIGxvY2FscmVjaXBpZW50PC9maWVsZD4NCis8ZmllbGQ+DQorRGF0ZTogV2VkLCAxMSBGZWIgOTggMTE6NTEgQ1NUPC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitUaGlzIGlzIGEgdmVyeSBzaW1wbGUgbWVzc2FnZSB3aXRoIGEgc2ltcGxlIGJvZHkgYW5kIG5vIHdlaXJkIHRoaW5ncyBhdCANCithbGwuDQorDQordGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgdGhpcyBpcyBhIHZlcnkgdmVyeSBsb25nIGxpbmUgDQorDQorRG9uZS48L2JvZHk+DQorPC9tZXNzYWdlPg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi12ZXJ5LWxvbmctbGluZXNfZGVjb2RlZC54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4tdmVyeS1sb25nLWxpbmVzX2RlY29kZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2VhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4tdmVyeS1sb25nLWxpbmVzX2RlY29kZWQueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK1JldHVybi1QYXRoOiBmb29AZXhhbXBsZS5jb208L2ZpZWxkPg0KKzxmaWVsZD4NCitTdWJqZWN0OiBTaW1wbGUgU3ViamVjdDwvZmllbGQ+DQorPGZpZWxkPg0KK0Zyb206IGZvb0BleGFtcGxlLmNvbTwvZmllbGQ+DQorPGZpZWxkPg0KK1RvOiBiYXJAZXhhbXBsZS5jb208L2ZpZWxkPg0KKzxmaWVsZD4NCitDYzogcmVjaXBpZW50MUBleGFtcGxlLmNvbSxyZWNpcGllbnQyQGV4YW1wbGUuY29tLCBsb2NhbHJlY2lwaWVudDwvZmllbGQ+DQorPGZpZWxkPg0KK0RhdGU6IFdlZCwgMTEgRmViIDk4IDExOjUxIENTVDwvZmllbGQ+DQorPC9oZWFkZXI+DQorPHRleHQtYm9keSBuYW1lPSJiYXNpYy1wbGFpbi12ZXJ5LWxvbmctbGluZXNfZGVjb2RlZF8xLnR4dCIvPg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4tdmVyeS1sb25nLWxpbmVzX2RlY29kZWRfMS50eHQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4tdmVyeS1sb25nLWxpbmVzX2RlY29kZWRfMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5OWZhNAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi12ZXJ5LWxvbmctbGluZXNfZGVjb2RlZF8xLnR4dApAQCAtMCwwICsxLDYgQEAKK1RoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdlIHdpdGggYSBzaW1wbGUgYm9keSBhbmQgbm8gd2VpcmQgdGhpbmdzIGF0IA0KK2FsbC4NCisNCit0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGxvbmcgbGluZSANCisNCitEb25lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi13aXRoLWJhZC1oZWFkZXItc2VwYXJhdG9yLm1zZyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi13aXRoLWJhZC1oZWFkZXItc2VwYXJhdG9yLm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNkNTg0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXdpdGgtYmFkLWhlYWRlci1zZXBhcmF0b3IubXNnCkBAIC0wLDAgKzEsMTIgQEAKK1JldHVybi1QYXRoOiBmb29AZXhhbXBsZS5jb20NCitTdWJqZWN0OiBTaW1wbGUgU3ViamVjdA0KK0Zyb206IGZvb0BleGFtcGxlLmNvbQ0KK1RvOiBiYXJAZXhhbXBsZS5jb20NCitDYzogcmVjaXBpZW50MUBleGFtcGxlLmNvbSxyZWNpcGllbnQyQGV4YW1wbGUuY29tLCBsb2NhbHJlY2lwaWVudA0KK0RhdGU6IFdlZCwgMTEgRmViIDk4IDExOjUxIENTVA0KKyANCitUaGlzIGlzIGEgdmVyeSBzaW1wbGUgbWVzc2FnZSB3aXRoIGEgc2ltcGxlIGJvZHkgYnV0IHRoZSBzZXBhcmF0b3INCitiZXR3ZWVuIGhlYWRlciBhbmQgYm9keSBjb250YWlucyBhbiBhZGRpdGlvbmFsIHNwYWNlOiANCitDUkxGPHNwYWNlPkNSTEYuDQorDQorVGhpcyByZXN1bHRzIGluIGEgYm9ndXMgaGVhZGVyLg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi13aXRoLWJhZC1oZWFkZXItc2VwYXJhdG9yLm91dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi13aXRoLWJhZC1oZWFkZXItc2VwYXJhdG9yLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTUzYTEyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXdpdGgtYmFkLWhlYWRlci1zZXBhcmF0b3Iub3V0CkBAIC0wLDAgKzEsOSBAQAorUmV0dXJuLVBhdGg6IGZvb0BleGFtcGxlLmNvbQ0KK1N1YmplY3Q6IFNpbXBsZSBTdWJqZWN0DQorRnJvbTogZm9vQGV4YW1wbGUuY29tDQorVG86IGJhckBleGFtcGxlLmNvbQ0KK0NjOiByZWNpcGllbnQxQGV4YW1wbGUuY29tLHJlY2lwaWVudDJAZXhhbXBsZS5jb20sIGxvY2FscmVjaXBpZW50DQorRGF0ZTogV2VkLCAxMSBGZWIgOTggMTE6NTEgQ1NUDQorIA0KKw0KK1RoaXMgcmVzdWx0cyBpbiBhIGJvZ3VzIGhlYWRlci4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4td2l0aC1iYWQtaGVhZGVyLXNlcGFyYXRvci54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4td2l0aC1iYWQtaGVhZGVyLXNlcGFyYXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhOThiNgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi13aXRoLWJhZC1oZWFkZXItc2VwYXJhdG9yLnhtbApAQCAtMCwwICsxLDIwIEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitSZXR1cm4tUGF0aDogZm9vQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogU2ltcGxlIFN1YmplY3Q8L2ZpZWxkPg0KKzxmaWVsZD4NCitGcm9tOiBmb29AZXhhbXBsZS5jb208L2ZpZWxkPg0KKzxmaWVsZD4NCitUbzogYmFyQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorQ2M6IHJlY2lwaWVudDFAZXhhbXBsZS5jb20scmVjaXBpZW50MkBleGFtcGxlLmNvbSwgbG9jYWxyZWNpcGllbnQ8L2ZpZWxkPg0KKzxmaWVsZD4NCitEYXRlOiBXZWQsIDExIEZlYiA5OCAxMTo1MSBDU1QNCisgPC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitUaGlzIHJlc3VsdHMgaW4gYSBib2d1cyBoZWFkZXIuDQorPC9ib2R5Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4td2l0aC1iYWQtaGVhZGVyLXNlcGFyYXRvcl9kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi13aXRoLWJhZC1oZWFkZXItc2VwYXJhdG9yX2RlY29kZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MDE4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4td2l0aC1iYWQtaGVhZGVyLXNlcGFyYXRvcl9kZWNvZGVkLnhtbApAQCAtMCwwICsxLDE4IEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitSZXR1cm4tUGF0aDogZm9vQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogU2ltcGxlIFN1YmplY3Q8L2ZpZWxkPg0KKzxmaWVsZD4NCitGcm9tOiBmb29AZXhhbXBsZS5jb208L2ZpZWxkPg0KKzxmaWVsZD4NCitUbzogYmFyQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorQ2M6IHJlY2lwaWVudDFAZXhhbXBsZS5jb20scmVjaXBpZW50MkBleGFtcGxlLmNvbSwgbG9jYWxyZWNpcGllbnQ8L2ZpZWxkPg0KKzxmaWVsZD4NCitEYXRlOiBXZWQsIDExIEZlYiA5OCAxMTo1MSBDU1QNCisgPC9maWVsZD4NCis8L2hlYWRlcj4NCis8dGV4dC1ib2R5IG5hbWU9ImJhc2ljLXBsYWluLXdpdGgtYmFkLWhlYWRlci1zZXBhcmF0b3JfZGVjb2RlZF8xLnR4dCIvPg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW4td2l0aC1iYWQtaGVhZGVyLXNlcGFyYXRvcl9kZWNvZGVkXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXdpdGgtYmFkLWhlYWRlci1zZXBhcmF0b3JfZGVjb2RlZF8xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY2OGExCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLXdpdGgtYmFkLWhlYWRlci1zZXBhcmF0b3JfZGVjb2RlZF8xLnR4dApAQCAtMCwwICsxIEBACitUaGlzIHJlc3VsdHMgaW4gYSBib2d1cyBoZWFkZXIuDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLm1zZyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi5tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NjlkNwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi5tc2cKQEAgLTAsMCArMSw5IEBACitSZXR1cm4tUGF0aDogZm9vQGV4YW1wbGUuY29tDQorU3ViamVjdDogU2ltcGxlIFN1YmplY3QNCitGcm9tOiBmb29AZXhhbXBsZS5jb20NCitUbzogYmFyQGV4YW1wbGUuY29tDQorQ2M6IHJlY2lwaWVudDFAZXhhbXBsZS5jb20scmVjaXBpZW50MkBleGFtcGxlLmNvbSwgbG9jYWxyZWNpcGllbnQNCitEYXRlOiBXZWQsIDExIEZlYiA5OCAxMTo1MSBDU1QNCisNCitUaGlzIGlzIGEgdmVyeSBzaW1wbGUgbWVzc2FnZSB3aXRoIGEgc2ltcGxlIGJvZHkgYW5kIG5vIHdlaXJkIHRoaW5ncyBhdCANCithbGwuDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLm91dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0NjlkNwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi5vdXQKQEAgLTAsMCArMSw5IEBACitSZXR1cm4tUGF0aDogZm9vQGV4YW1wbGUuY29tDQorU3ViamVjdDogU2ltcGxlIFN1YmplY3QNCitGcm9tOiBmb29AZXhhbXBsZS5jb20NCitUbzogYmFyQGV4YW1wbGUuY29tDQorQ2M6IHJlY2lwaWVudDFAZXhhbXBsZS5jb20scmVjaXBpZW50MkBleGFtcGxlLmNvbSwgbG9jYWxyZWNpcGllbnQNCitEYXRlOiBXZWQsIDExIEZlYiA5OCAxMTo1MSBDU1QNCisNCitUaGlzIGlzIGEgdmVyeSBzaW1wbGUgbWVzc2FnZSB3aXRoIGEgc2ltcGxlIGJvZHkgYW5kIG5vIHdlaXJkIHRoaW5ncyBhdCANCithbGwuDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2Jhc2ljLXBsYWluLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjNmMwMgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbi54bWwKQEAgLTAsMCArMSwyMCBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorUmV0dXJuLVBhdGg6IGZvb0BleGFtcGxlLmNvbTwvZmllbGQ+DQorPGZpZWxkPg0KK1N1YmplY3Q6IFNpbXBsZSBTdWJqZWN0PC9maWVsZD4NCis8ZmllbGQ+DQorRnJvbTogZm9vQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorVG86IGJhckBleGFtcGxlLmNvbTwvZmllbGQ+DQorPGZpZWxkPg0KK0NjOiByZWNpcGllbnQxQGV4YW1wbGUuY29tLHJlY2lwaWVudDJAZXhhbXBsZS5jb20sIGxvY2FscmVjaXBpZW50PC9maWVsZD4NCis8ZmllbGQ+DQorRGF0ZTogV2VkLCAxMSBGZWIgOTggMTE6NTEgQ1NUPC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitUaGlzIGlzIGEgdmVyeSBzaW1wbGUgbWVzc2FnZSB3aXRoIGEgc2ltcGxlIGJvZHkgYW5kIG5vIHdlaXJkIHRoaW5ncyBhdCANCithbGwuDQorPC9ib2R5Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW5fZGVjb2RlZC54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW5fZGVjb2RlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4ZTJlNQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbl9kZWNvZGVkLnhtbApAQCAtMCwwICsxLDE3IEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitSZXR1cm4tUGF0aDogZm9vQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogU2ltcGxlIFN1YmplY3Q8L2ZpZWxkPg0KKzxmaWVsZD4NCitGcm9tOiBmb29AZXhhbXBsZS5jb208L2ZpZWxkPg0KKzxmaWVsZD4NCitUbzogYmFyQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorQ2M6IHJlY2lwaWVudDFAZXhhbXBsZS5jb20scmVjaXBpZW50MkBleGFtcGxlLmNvbSwgbG9jYWxyZWNpcGllbnQ8L2ZpZWxkPg0KKzxmaWVsZD4NCitEYXRlOiBXZWQsIDExIEZlYiA5OCAxMTo1MSBDU1Q8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0iYmFzaWMtcGxhaW5fZGVjb2RlZF8xLnR4dCIvPg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW5fZGVjb2RlZF8xLnR4dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9iYXNpYy1wbGFpbl9kZWNvZGVkXzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjZjM2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvYmFzaWMtcGxhaW5fZGVjb2RlZF8xLnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBtZXNzYWdlIHdpdGggYSBzaW1wbGUgYm9keSBhbmQgbm8gd2VpcmQgdGhpbmdzIGF0IA0KK2FsbC4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZW5kaW5nLWJvdW5kYXJpZXMubXNnIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2VuZGluZy1ib3VuZGFyaWVzLm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTI0NDRiCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2VuZGluZy1ib3VuZGFyaWVzLm1zZwpAQCAtMCwwICsxLDIxIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9ImJvdW5kYXJ5Ig0KKw0KKy0tYm91bmRhcnkgVGhpcyBzaG91bGQgYmUgaWdub3JlZCBDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyDQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQorDQorZmlyc3QgcGFydA0KKw0KKy0tYm91bmRhcnktLSBUaGlzIHNob3VsZCBiZSBpZ25vcmVkIGF0IGFsbCBhbmQgbm90IHBhcnQgb2YgdGhlIGVwaWxvZ3VlLg0KKw0KK0Zyb20gdGhlIFJGQyBhYm91dCBlbmRpbmcgYm91bmRhcnk6DQorDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK05PVEUgVE8gSU1QTEVNRU5UT1JTOiAgQm91bmRhcnkgc3RyaW5nIGNvbXBhcmlzb25zIG11c3QgY29tcGFyZSB0aGUNCitib3VuZGFyeSB2YWx1ZSB3aXRoIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBjYW5kaWRhdGUgbGluZS4gIEFuIGV4YWN0DQorbWF0Y2ggb2YgdGhlIGVudGlyZSBjYW5kaWRhdGUgbGluZSBpcyBub3QgcmVxdWlyZWQ7IGl0IGlzIHN1ZmZpY2llbnQNCit0aGF0IHRoZSBib3VuZGFyeSBhcHBlYXIgaW4gaXRzIGVudGlyZXR5IGZvbGxvd2luZyB0aGUgQ1JMRi4NCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorLS1ib3VuZGFyeS0tDQorDQorVGhlIGFib3ZlIGJvdW5kYXJ5IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBlcGlsb2d1ZSwgdG9vLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9lbmRpbmctYm91bmRhcmllcy5vdXQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZW5kaW5nLWJvdW5kYXJpZXMub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjBkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZW5kaW5nLWJvdW5kYXJpZXMub3V0CkBAIC0wLDAgKzEsMjIgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iYm91bmRhcnkiDQorDQorDQorLS1ib3VuZGFyeQ0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbg0KKw0KK2ZpcnN0IHBhcnQNCisNCistLWJvdW5kYXJ5LS0NCisNCitGcm9tIHRoZSBSRkMgYWJvdXQgZW5kaW5nIGJvdW5kYXJ5Og0KKw0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCitOT1RFIFRPIElNUExFTUVOVE9SUzogIEJvdW5kYXJ5IHN0cmluZyBjb21wYXJpc29ucyBtdXN0IGNvbXBhcmUgdGhlDQorYm91bmRhcnkgdmFsdWUgd2l0aCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggY2FuZGlkYXRlIGxpbmUuICBBbiBleGFjdA0KK21hdGNoIG9mIHRoZSBlbnRpcmUgY2FuZGlkYXRlIGxpbmUgaXMgbm90IHJlcXVpcmVkOyBpdCBpcyBzdWZmaWNpZW50DQordGhhdCB0aGUgYm91bmRhcnkgYXBwZWFyIGluIGl0cyBlbnRpcmV0eSBmb2xsb3dpbmcgdGhlIENSTEYuDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KKy0tYm91bmRhcnktLQ0KKw0KK1RoZSBhYm92ZSBib3VuZGFyeSBzaG91bGQgYmUgcGFydCBvZiB0aGUgZXBpbG9ndWUsIHRvby4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZW5kaW5nLWJvdW5kYXJpZXMueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2VuZGluZy1ib3VuZGFyaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjhhOTJiCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2VuZGluZy1ib3VuZGFyaWVzLnhtbApAQCAtMCwwICsxLDMzIEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9ImJvdW5kYXJ5IjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPGJvZHk+DQorZmlyc3QgcGFydA0KKzwvYm9keT4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorDQorRnJvbSB0aGUgUkZDIGFib3V0IGVuZGluZyBib3VuZGFyeToNCisNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorTk9URSBUTyBJTVBMRU1FTlRPUlM6ICBCb3VuZGFyeSBzdHJpbmcgY29tcGFyaXNvbnMgbXVzdCBjb21wYXJlIHRoZQ0KK2JvdW5kYXJ5IHZhbHVlIHdpdGggdGhlIGJlZ2lubmluZyBvZiBlYWNoIGNhbmRpZGF0ZSBsaW5lLiAgQW4gZXhhY3QNCittYXRjaCBvZiB0aGUgZW50aXJlIGNhbmRpZGF0ZSBsaW5lIGlzIG5vdCByZXF1aXJlZDsgaXQgaXMgc3VmZmljaWVudA0KK3RoYXQgdGhlIGJvdW5kYXJ5IGFwcGVhciBpbiBpdHMgZW50aXJldHkgZm9sbG93aW5nIHRoZSBDUkxGLg0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCistLWJvdW5kYXJ5LS0NCisNCitUaGUgYWJvdmUgYm91bmRhcnkgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGVwaWxvZ3VlLCB0b28uPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2VuZGluZy1ib3VuZGFyaWVzX2RlY29kZWQueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2VuZGluZy1ib3VuZGFyaWVzX2RlY29kZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZWI3YzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZW5kaW5nLWJvdW5kYXJpZXNfZGVjb2RlZC54bWwKQEAgLTAsMCArMSwzMSBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJib3VuZGFyeSI8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtdWx0aXBhcnQ+DQorPHByZWFtYmxlPg0KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW48L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0iZW5kaW5nLWJvdW5kYXJpZXNfZGVjb2RlZF8xXzEudHh0Ii8+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KKw0KK0Zyb20gdGhlIFJGQyBhYm91dCBlbmRpbmcgYm91bmRhcnk6DQorDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK05PVEUgVE8gSU1QTEVNRU5UT1JTOiAgQm91bmRhcnkgc3RyaW5nIGNvbXBhcmlzb25zIG11c3QgY29tcGFyZSB0aGUNCitib3VuZGFyeSB2YWx1ZSB3aXRoIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBjYW5kaWRhdGUgbGluZS4gIEFuIGV4YWN0DQorbWF0Y2ggb2YgdGhlIGVudGlyZSBjYW5kaWRhdGUgbGluZSBpcyBub3QgcmVxdWlyZWQ7IGl0IGlzIHN1ZmZpY2llbnQNCit0aGF0IHRoZSBib3VuZGFyeSBhcHBlYXIgaW4gaXRzIGVudGlyZXR5IGZvbGxvd2luZyB0aGUgQ1JMRi4NCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorLS1ib3VuZGFyeS0tDQorDQorVGhlIGFib3ZlIGJvdW5kYXJ5IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBlcGlsb2d1ZSwgdG9vLjwvZXBpbG9ndWU+DQorPC9tdWx0aXBhcnQ+DQorPC9tZXNzYWdlPg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9lbmRpbmctYm91bmRhcmllc19kZWNvZGVkXzFfMS50eHQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZW5kaW5nLWJvdW5kYXJpZXNfZGVjb2RlZF8xXzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZDc0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZW5kaW5nLWJvdW5kYXJpZXNfZGVjb2RlZF8xXzEudHh0CkBAIC0wLDAgKzEgQEAKK2ZpcnN0IHBhcnQNCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZS5tc2cgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZS5tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhYjc0MQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9leGFtcGxlLm1zZwpAQCAtMCwwICsxLDE0OSBAQAorUmV0dXJuLVBhdGg6IDxyb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWs+DQorUmVjZWl2ZWQ6IChxbWFpbCAxODU1NCBpbnZva2VkIGZyb20gbmV0d29yayk7IDI1IE1heSAyMDA4IDE0OjM4OjUzIC0wMDAwDQorUmVjZWl2ZWQ6IGZyb20gdW5rbm93biAoSEVMTyBwM3ByZXNtdHAwMS0xNi5wcm9kLnBoeDMuc2VjdXJlc2VydmVyLm5ldCkNCisgICAgICAgIChbMjA4LjEwOS44MC4xNjVdKSAoZW52ZWxvcGUtc2VuZGVyIDxyZG9ua2luLW93bmVyQGxvY3VzLmFwYWNoZS5vcmc+KSBieQ0KKyAgICAgICAgc210cDIwLTAxLnByb2QubWVzYTEuc2VjdXJlc2VydmVyLm5ldCAocW1haWwtMS4wMykgd2l0aCBTTVRQIGZvcg0KKyAgICAgICAgPGFzZkB4bWxtYXB0Lm9yZz47IDI1IE1heSAyMDA4IDE0OjM4OjUzIC0wMDAwDQorUmVjZWl2ZWQ6IChxbWFpbCA5NzUxIGludm9rZWQgZnJvbSBuZXR3b3JrKTsgMjUgTWF5IDIwMDggMTQ6Mzg6NTMgLTAwMDANCitSZWNlaXZlZDogZnJvbSBtaW5vdGF1ci5hcGFjaGUub3JnIChbMTQwLjIxMS4xMS45XSkgKGVudmVsb3BlLXNlbmRlcg0KKyAgICAgICAgPHJkb25raW4tb3duZXJAbG9jdXMuYXBhY2hlLm9yZz4pIGJ5DQorICAgICAgICBwM3ByZXNtdHAwMS0xNi5wcm9kLnBoeDMuc2VjdXJlc2VydmVyLm5ldCAocW1haWwtbGRhcC0xLjAzKSB3aXRoIFNNVFAgZm9yDQorICAgICAgICA8YXNmQHhtbG1hcHQub3JnPjsgMjUgTWF5IDIwMDggMTQ6Mzg6NTAgLTAwMDANCitSZWNlaXZlZDogKHFtYWlsIDQ2NzY4IGludm9rZWQgYnkgdWlkIDEyODkpOyAyNSBNYXkgMjAwOCAxNDozODo0NiAtMDAwMA0KK0RlbGl2ZXJlZC1UbzogcmRvbmtpbkBsb2N1cy5hcGFjaGUub3JnDQorUmVjZWl2ZWQ6IChxbWFpbCA0Njc2MyBpbnZva2VkIGZyb20gbmV0d29yayk7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwDQorUmVjZWl2ZWQ6IGZyb20gaGVybWVzLmFwYWNoZS5vcmcgKEhFTE8gbWFpbC5hcGFjaGUub3JnKSAoMTQwLjIxMS4xMS4yKSBieQ0KKyAgICAgICAgbWlub3RhdXIuYXBhY2hlLm9yZyB3aXRoIFNNVFA7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwDQorUmVjZWl2ZWQ6IChxbWFpbCA2MTI3NSBpbnZva2VkIGJ5IHVpZCA1MDApOyAyNSBNYXkgMjAwOCAxNDozODo0OCAtMDAwMA0KK0RlbGl2ZXJlZC1UbzogYXBtYWlsLXJkb25raW5AYXBhY2hlLm9yZw0KK0RlbGl2ZXJlZC1Ubzogcm9iQGxvY2FsaG9zdA0KK0RlbGl2ZXJlZC1Ubzogcm9iQGxvY2FsaG9zdA0KK1JlY2VpdmVkOiAocW1haWwgNjEyNzIgaW52b2tlZCBieSB1aWQgOTkpOyAyNSBNYXkgMjAwOCAxNDozODo0OCAtMDAwMA0KK1JlY2VpdmVkOiBmcm9tIGF0aGVuYS5hcGFjaGUub3JnIChIRUxPIGF0aGVuYS5hcGFjaGUub3JnKSAoMTQwLjIxMS4xMS4xMzYpDQorICAgICAgICBieSBhcGFjaGUub3JnIChxcHNtdHBkLzAuMjkpIHdpdGggRVNNVFA7IFN1biwgMjUgTWF5IDIwMDggMDc6Mzg6NDggLTA3MDANCitYLUFTRi1TcGFtLVN0YXR1czogTm8sIGhpdHM9LTAuMCByZXF1aXJlZD0xMC4wIHRlc3RzPVNQRl9QQVNTDQorWC1TcGFtLUNoZWNrLUJ5OiBhcGFjaGUub3JnDQorUmVjZWl2ZWQtU1BGOiBwYXNzIChhdGhlbmEuYXBhY2hlLm9yZzogZG9tYWluIG9mDQorICAgICAgICByb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWsgZGVzaWduYXRlcyAxOTUuMTg4LjIxMy41IGFzIHBlcm1pdHRlZA0KKyAgICAgICAgc2VuZGVyKQ0KK1JlY2VpdmVkOiBmcm9tIFsxOTUuMTg4LjIxMy41XSAoSEVMTyBzbXRwLW91dDIuYmx1ZXlvbmRlci5jby51aykNCisgICAgICAgICgxOTUuMTg4LjIxMy41KSBieSBhcGFjaGUub3JnIChxcHNtdHBkLzAuMjkpIHdpdGggRVNNVFA7IFN1biwgMjUgTWF5IDIwMDgNCisgICAgICAgIDE0OjM4OjAwICswMDAwDQorUmVjZWl2ZWQ6IGZyb20gWzE3Mi4yMy4xNzAuMTQwXSAoaGVsbz1hbnRpLXZpcnVzMDItMDcpIGJ5DQorICAgICAgICBzbXRwLW91dDIuYmx1ZXlvbmRlci5jby51ayB3aXRoIHNtdHAgKEV4aW0gNC41MikgaWQgMUswSE1WLTAwMDg3ZS1IWSBmb3INCisgICAgICAgIHJkb25raW5AYXBhY2hlLm9yZzsgU3VuLCAyNSBNYXkgMjAwOCAxNTozODoxNSArMDEwMA0KK1JlY2VpdmVkOiBmcm9tIFs4Mi4zOC42NS42XSAoaGVsbz1bMTAuMC4wLjI3XSkgYnkNCisgICAgICAgIGFzbXRwLW91dDUuYmx1ZXlvbmRlci5jby51ayB3aXRoIGVzbXRwYSAoRXhpbSA0LjUyKSBpZCAxSzBITVUtMDAwMUEyLTNxIGZvcg0KKyAgICAgICAgcmRvbmtpbkBhcGFjaGUub3JnOyBTdW4sIDI1IE1heSAyMDA4IDE1OjM4OjE0ICswMTAwDQorU3ViamVjdDogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbXVsdGlwYXJ0IG1peGVkIGVtYWlsIHdpdGggaW1hZ2UgY29udGVudA0KK0Zyb206IFJvYmVydCBCdXJyZWxsIERvbmtpbiA8cm9iZXJ0YnVycmVsbGRvbmtpbkBibHVleW9uZGVyLmNvLnVrPg0KK1RvOiBSb2JlcnQgQnVycmVsbCBEb25raW4gPHJkb25raW5AYXBhY2hlLm9yZz4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij0tdElkR1lWc3RRSmdoeUVEQVRuSisiDQorRGF0ZTogU3VuLCAyNSBNYXkgMjAwOCAxNTozODoxMyArMDEwMA0KK01lc3NhZ2UtSWQ6IDwxMjExNzI2MjkzLjU3NzIuMTAuY2FtZWxAbG9jYWxob3N0Pg0KK01pbWUtVmVyc2lvbjogMS4wDQorWC1NYWlsZXI6IEV2b2x1dGlvbiAyLjEyLjMgDQorWC1WaXJ1cy1DaGVja2VkOiBDaGVja2VkIGJ5IENsYW1BViBvbiBhcGFjaGUub3JnDQorWC1Ob25zcGFtOiBOb25lDQorWC1mZXRjaGVkLWZyb206IG1haWwueG1sbWFwdC5vcmcNCitYLUV2b2x1dGlvbi1Tb3VyY2U6IGltYXA6Ly9yb2JAdGhlYmVzLw0KKw0KKw0KKy0tPS10SWRHWVZzdFFKZ2h5RURBVG5KKw0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQNCisNCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyANCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQordW5kZXIgdGhlIExpY2Vuc2UuDQorLS09LXRJZEdZVnN0UUpnaHlFREFUbkorDQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9YmxvYi5wbmc7DQorICAgbW9kaWZpY2F0aW9uLWRhdGU9IlN1biwgMjEgSnVuIDIwMDggMTU6MzI6MTggKzAwMDAiOyBjcmVhdGlvbi1kYXRlPSJTYXQsIDIwIEp1biAyMDA4IDEwOjE1OjA5ICswMDAwIjsgcmVhZC1kYXRlPSJNb24sIDIyIEp1biAyMDA4IDEyOjA4OjU2ICswMDAwIjtzaXplPTEwMjM0Ow0KK0NvbnRlbnQtVHlwZTogaW1hZ2UvcG5nOyBuYW1lPWJsb2IucG5nDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQorDQoraVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUtDQUlBQUFBQ1VGanFBQUFBQVhOU1IwSUFyczRjNlFBQUFBbHdTRmx6QUFBTA0KK0V3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5Z0ZHUTRpSjk5dWZjWUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm8NCitJRWRKVFZCWGdRNFhBQUFBMEVsRVFWUVkwMlhNd1VyRFFCaEY0WHNua3lZaGpXSmFDbG9FTjc3L2EvZ0VSVndKTFFpaU5qWW1iVHFaDQorLzdxSUcvVnNQemlNVHcrMjNXai9vdlpkTVFKZ1ZpQ3ZXTlZ1c2ZhMjNkanVVZjJudWdibkkyUnlua1dGNWEyRndkdnJzN3E5dmhxRQ0KK0UyUUFFSU82QmhaQmVyVWY2bHVNdzQ5TnlUUjBPTHc1a0pEOXNxazRJcHdjNkdBUkV2NW41cGlYVERPUWZ5MUpNU3M4WmdYS3Eya0YNCitpd0RnRXJpRWVjbkxsZWZGRW1HQUl2cUQ0Z2dKSk5NTTg1cUx0WGZYOXhZR3VFUSs0L2tJaTBnODh6bFhkNjYrK1FhUURHNUdQWnlwDQorclFBQUFBQkpSVTVFcmtKZ2dnPT0NCisNCisNCistLT0tdElkR1lWc3RRSmdoeUVEQVRuSisNCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1ibG9iLnBuZw0KK0NvbnRlbnQtVHlwZTogaW1hZ2UvcG5nOyBuYW1lPWJsb2IucG5nDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQorDQoraVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUtDQUlBQUFBQ1VGanFBQUFBQVhOU1IwSUFyczRjNlFBQUFBbHdTRmx6QUFBTA0KK0V3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5Z0ZHUTRpSjk5dWZjWUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm8NCitJRWRKVFZCWGdRNFhBQUFBMEVsRVFWUVkwMlhNd1VyRFFCaEY0WHNua3lZaGpXSmFDbG9FTjc3L2EvZ0VSVndKTFFpaU5qWW1iVHFaDQorLzdxSUcvVnNQemlNVHcrMjNXai9vdlpkTVFKZ1ZpQ3ZXTlZ1c2ZhMjNkanVVZjJudWdibkkyUnlua1dGNWEyRndkdnJzN3E5dmhxRQ0KK0UyUUFFSU82QmhaQmVyVWY2bHVNdzQ5TnlUUjBPTHc1a0pEOXNxazRJcHdjNkdBUkV2NW41cGlYVERPUWZ5MUpNU3M4WmdYS3Eya0YNCitpd0RnRXJpRWVjbkxsZWZGRW1HQUl2cUQ0Z2dKSk5NTTg1cUx0WGZYOXhZR3VFUSs0L2tJaTBnODh6bFhkNjYrK1FhUURHNUdQWnlwDQorclFBQUFBQkpSVTVFcmtKZ2dnPT0NCisNCisNCistLT0tdElkR1lWc3RRSmdoeUVEQVRuSisNCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1yaHViYXJiLnR4dA0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgbmFtZT1yaHViYXJiLnR4dDsgY2hhcnNldD11cy1hc2NpaQ0KK0NvbnRlbnQtTGFuZ3VhZ2U6IGVuLCBlbi1VUywgZW4tQ0ENCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlDQorDQorUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1PQ0KK2JhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcj0NCitiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFI9DQoraHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViPQ0KK2FyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYj0NCisgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmg9DQordWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhPQ0KK3JiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiID0NCitSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHU9DQorYmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyPQ0KK2IgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUj0NCitodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWI9DQorYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiPQ0KKyBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaD0NCit1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmE9DQorcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgPQ0KK1JodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodT0NCitiYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXI9DQorYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSPQ0KK2h1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1Yj0NCithcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmI9DQorIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJoPQ0KK3ViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYT0NCityYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiA9DQorUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1PQ0KK2JhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcj0NCitiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFI9DQoraHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViPQ0KK2FyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYj0NCisgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmg9DQordWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhPQ0KK3JiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiID0NCitSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHU9DQorYmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyPQ0KK2IgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUj0NCitodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWI9DQorYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiPQ0KKyBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaD0NCit1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmE9DQorcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgPQ0KK1JodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiDQorDQorLS09LXRJZEdZVnN0UUpnaHlFREFUbkorLS0NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZS5vdXQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiZTMwOQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9leGFtcGxlLm91dApAQCAtMCwwICsxLDE0NyBAQAorUmV0dXJuLVBhdGg6IDxyb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWs+DQorUmVjZWl2ZWQ6IChxbWFpbCAxODU1NCBpbnZva2VkIGZyb20gbmV0d29yayk7IDI1IE1heSAyMDA4IDE0OjM4OjUzIC0wMDAwDQorUmVjZWl2ZWQ6IGZyb20gdW5rbm93biAoSEVMTyBwM3ByZXNtdHAwMS0xNi5wcm9kLnBoeDMuc2VjdXJlc2VydmVyLm5ldCkNCisgICAgICAgIChbMjA4LjEwOS44MC4xNjVdKSAoZW52ZWxvcGUtc2VuZGVyIDxyZG9ua2luLW93bmVyQGxvY3VzLmFwYWNoZS5vcmc+KSBieQ0KKyAgICAgICAgc210cDIwLTAxLnByb2QubWVzYTEuc2VjdXJlc2VydmVyLm5ldCAocW1haWwtMS4wMykgd2l0aCBTTVRQIGZvcg0KKyAgICAgICAgPGFzZkB4bWxtYXB0Lm9yZz47IDI1IE1heSAyMDA4IDE0OjM4OjUzIC0wMDAwDQorUmVjZWl2ZWQ6IChxbWFpbCA5NzUxIGludm9rZWQgZnJvbSBuZXR3b3JrKTsgMjUgTWF5IDIwMDggMTQ6Mzg6NTMgLTAwMDANCitSZWNlaXZlZDogZnJvbSBtaW5vdGF1ci5hcGFjaGUub3JnIChbMTQwLjIxMS4xMS45XSkgKGVudmVsb3BlLXNlbmRlcg0KKyAgICAgICAgPHJkb25raW4tb3duZXJAbG9jdXMuYXBhY2hlLm9yZz4pIGJ5DQorICAgICAgICBwM3ByZXNtdHAwMS0xNi5wcm9kLnBoeDMuc2VjdXJlc2VydmVyLm5ldCAocW1haWwtbGRhcC0xLjAzKSB3aXRoIFNNVFAgZm9yDQorICAgICAgICA8YXNmQHhtbG1hcHQub3JnPjsgMjUgTWF5IDIwMDggMTQ6Mzg6NTAgLTAwMDANCitSZWNlaXZlZDogKHFtYWlsIDQ2NzY4IGludm9rZWQgYnkgdWlkIDEyODkpOyAyNSBNYXkgMjAwOCAxNDozODo0NiAtMDAwMA0KK0RlbGl2ZXJlZC1UbzogcmRvbmtpbkBsb2N1cy5hcGFjaGUub3JnDQorUmVjZWl2ZWQ6IChxbWFpbCA0Njc2MyBpbnZva2VkIGZyb20gbmV0d29yayk7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwDQorUmVjZWl2ZWQ6IGZyb20gaGVybWVzLmFwYWNoZS5vcmcgKEhFTE8gbWFpbC5hcGFjaGUub3JnKSAoMTQwLjIxMS4xMS4yKSBieQ0KKyAgICAgICAgbWlub3RhdXIuYXBhY2hlLm9yZyB3aXRoIFNNVFA7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwDQorUmVjZWl2ZWQ6IChxbWFpbCA2MTI3NSBpbnZva2VkIGJ5IHVpZCA1MDApOyAyNSBNYXkgMjAwOCAxNDozODo0OCAtMDAwMA0KK0RlbGl2ZXJlZC1UbzogYXBtYWlsLXJkb25raW5AYXBhY2hlLm9yZw0KK0RlbGl2ZXJlZC1Ubzogcm9iQGxvY2FsaG9zdA0KK0RlbGl2ZXJlZC1Ubzogcm9iQGxvY2FsaG9zdA0KK1JlY2VpdmVkOiAocW1haWwgNjEyNzIgaW52b2tlZCBieSB1aWQgOTkpOyAyNSBNYXkgMjAwOCAxNDozODo0OCAtMDAwMA0KK1JlY2VpdmVkOiBmcm9tIGF0aGVuYS5hcGFjaGUub3JnIChIRUxPIGF0aGVuYS5hcGFjaGUub3JnKSAoMTQwLjIxMS4xMS4xMzYpDQorICAgICAgICBieSBhcGFjaGUub3JnIChxcHNtdHBkLzAuMjkpIHdpdGggRVNNVFA7IFN1biwgMjUgTWF5IDIwMDggMDc6Mzg6NDggLTA3MDANCitYLUFTRi1TcGFtLVN0YXR1czogTm8sIGhpdHM9LTAuMCByZXF1aXJlZD0xMC4wIHRlc3RzPVNQRl9QQVNTDQorWC1TcGFtLUNoZWNrLUJ5OiBhcGFjaGUub3JnDQorUmVjZWl2ZWQtU1BGOiBwYXNzIChhdGhlbmEuYXBhY2hlLm9yZzogZG9tYWluIG9mDQorICAgICAgICByb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWsgZGVzaWduYXRlcyAxOTUuMTg4LjIxMy41IGFzIHBlcm1pdHRlZA0KKyAgICAgICAgc2VuZGVyKQ0KK1JlY2VpdmVkOiBmcm9tIFsxOTUuMTg4LjIxMy41XSAoSEVMTyBzbXRwLW91dDIuYmx1ZXlvbmRlci5jby51aykNCisgICAgICAgICgxOTUuMTg4LjIxMy41KSBieSBhcGFjaGUub3JnIChxcHNtdHBkLzAuMjkpIHdpdGggRVNNVFA7IFN1biwgMjUgTWF5IDIwMDgNCisgICAgICAgIDE0OjM4OjAwICswMDAwDQorUmVjZWl2ZWQ6IGZyb20gWzE3Mi4yMy4xNzAuMTQwXSAoaGVsbz1hbnRpLXZpcnVzMDItMDcpIGJ5DQorICAgICAgICBzbXRwLW91dDIuYmx1ZXlvbmRlci5jby51ayB3aXRoIHNtdHAgKEV4aW0gNC41MikgaWQgMUswSE1WLTAwMDg3ZS1IWSBmb3INCisgICAgICAgIHJkb25raW5AYXBhY2hlLm9yZzsgU3VuLCAyNSBNYXkgMjAwOCAxNTozODoxNSArMDEwMA0KK1JlY2VpdmVkOiBmcm9tIFs4Mi4zOC42NS42XSAoaGVsbz1bMTAuMC4wLjI3XSkgYnkNCisgICAgICAgIGFzbXRwLW91dDUuYmx1ZXlvbmRlci5jby51ayB3aXRoIGVzbXRwYSAoRXhpbSA0LjUyKSBpZCAxSzBITVUtMDAwMUEyLTNxIGZvcg0KKyAgICAgICAgcmRvbmtpbkBhcGFjaGUub3JnOyBTdW4sIDI1IE1heSAyMDA4IDE1OjM4OjE0ICswMTAwDQorU3ViamVjdDogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbXVsdGlwYXJ0IG1peGVkIGVtYWlsIHdpdGggaW1hZ2UgY29udGVudA0KK0Zyb206IFJvYmVydCBCdXJyZWxsIERvbmtpbiA8cm9iZXJ0YnVycmVsbGRvbmtpbkBibHVleW9uZGVyLmNvLnVrPg0KK1RvOiBSb2JlcnQgQnVycmVsbCBEb25raW4gPHJkb25raW5AYXBhY2hlLm9yZz4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij0tdElkR1lWc3RRSmdoeUVEQVRuSisiDQorRGF0ZTogU3VuLCAyNSBNYXkgMjAwOCAxNTozODoxMyArMDEwMA0KK01lc3NhZ2UtSWQ6IDwxMjExNzI2MjkzLjU3NzIuMTAuY2FtZWxAbG9jYWxob3N0Pg0KK01pbWUtVmVyc2lvbjogMS4wDQorWC1NYWlsZXI6IEV2b2x1dGlvbiAyLjEyLjMgDQorWC1WaXJ1cy1DaGVja2VkOiBDaGVja2VkIGJ5IENsYW1BViBvbiBhcGFjaGUub3JnDQorWC1Ob25zcGFtOiBOb25lDQorWC1mZXRjaGVkLWZyb206IG1haWwueG1sbWFwdC5vcmcNCitYLUV2b2x1dGlvbi1Tb3VyY2U6IGltYXA6Ly9yb2JAdGhlYmVzLw0KKw0KKw0KKy0tPS10SWRHWVZzdFFKZ2h5RURBVG5KKw0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQNCisNCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyANCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQordW5kZXIgdGhlIExpY2Vuc2UuDQorLS09LXRJZEdZVnN0UUpnaHlFREFUbkorDQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9YmxvYi5wbmc7DQorICAgbW9kaWZpY2F0aW9uLWRhdGU9IlN1biwgMjEgSnVuIDIwMDggMTU6MzI6MTggKzAwMDAiOyBjcmVhdGlvbi1kYXRlPSJTYXQsIDIwIEp1biAyMDA4IDEwOjE1OjA5ICswMDAwIjsgcmVhZC1kYXRlPSJNb24sIDIyIEp1biAyMDA4IDEyOjA4OjU2ICswMDAwIjtzaXplPTEwMjM0Ow0KK0NvbnRlbnQtVHlwZTogaW1hZ2UvcG5nOyBuYW1lPWJsb2IucG5nDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQorDQoraVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUtDQUlBQUFBQ1VGanFBQUFBQVhOU1IwSUFyczRjNlFBQUFBbHdTRmx6QUFBTA0KK0V3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5Z0ZHUTRpSjk5dWZjWUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm8NCitJRWRKVFZCWGdRNFhBQUFBMEVsRVFWUVkwMlhNd1VyRFFCaEY0WHNua3lZaGpXSmFDbG9FTjc3L2EvZ0VSVndKTFFpaU5qWW1iVHFaDQorLzdxSUcvVnNQemlNVHcrMjNXai9vdlpkTVFKZ1ZpQ3ZXTlZ1c2ZhMjNkanVVZjJudWdibkkyUnlua1dGNWEyRndkdnJzN3E5dmhxRQ0KK0UyUUFFSU82QmhaQmVyVWY2bHVNdzQ5TnlUUjBPTHc1a0pEOXNxazRJcHdjNkdBUkV2NW41cGlYVERPUWZ5MUpNU3M4WmdYS3Eya0YNCitpd0RnRXJpRWVjbkxsZWZGRW1HQUl2cUQ0Z2dKSk5NTTg1cUx0WGZYOXhZR3VFUSs0L2tJaTBnODh6bFhkNjYrK1FhUURHNUdQWnlwDQorclFBQUFBQkpSVTVFcmtKZ2dnPT0NCisNCistLT0tdElkR1lWc3RRSmdoeUVEQVRuSisNCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1ibG9iLnBuZw0KK0NvbnRlbnQtVHlwZTogaW1hZ2UvcG5nOyBuYW1lPWJsb2IucG5nDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQorDQoraVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUtDQUlBQUFBQ1VGanFBQUFBQVhOU1IwSUFyczRjNlFBQUFBbHdTRmx6QUFBTA0KK0V3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5Z0ZHUTRpSjk5dWZjWUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm8NCitJRWRKVFZCWGdRNFhBQUFBMEVsRVFWUVkwMlhNd1VyRFFCaEY0WHNua3lZaGpXSmFDbG9FTjc3L2EvZ0VSVndKTFFpaU5qWW1iVHFaDQorLzdxSUcvVnNQemlNVHcrMjNXai9vdlpkTVFKZ1ZpQ3ZXTlZ1c2ZhMjNkanVVZjJudWdibkkyUnlua1dGNWEyRndkdnJzN3E5dmhxRQ0KK0UyUUFFSU82QmhaQmVyVWY2bHVNdzQ5TnlUUjBPTHc1a0pEOXNxazRJcHdjNkdBUkV2NW41cGlYVERPUWZ5MUpNU3M4WmdYS3Eya0YNCitpd0RnRXJpRWVjbkxsZWZGRW1HQUl2cUQ0Z2dKSk5NTTg1cUx0WGZYOXhZR3VFUSs0L2tJaTBnODh6bFhkNjYrK1FhUURHNUdQWnlwDQorclFBQUFBQkpSVTVFcmtKZ2dnPT0NCisNCistLT0tdElkR1lWc3RRSmdoeUVEQVRuSisNCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1yaHViYXJiLnR4dA0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgbmFtZT1yaHViYXJiLnR4dDsgY2hhcnNldD11cy1hc2NpaQ0KK0NvbnRlbnQtTGFuZ3VhZ2U6IGVuLCBlbi1VUywgZW4tQ0ENCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlDQorDQorUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1PQ0KK2JhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcj0NCitiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFI9DQoraHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViPQ0KK2FyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYj0NCisgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmg9DQordWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhPQ0KK3JiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiID0NCitSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHU9DQorYmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyPQ0KK2IgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUj0NCitodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWI9DQorYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiPQ0KKyBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaD0NCit1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmE9DQorcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgPQ0KK1JodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodT0NCitiYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXI9DQorYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSPQ0KK2h1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1Yj0NCithcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmI9DQorIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJoPQ0KK3ViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYT0NCityYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiA9DQorUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1PQ0KK2JhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcj0NCitiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFI9DQoraHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViPQ0KK2FyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYj0NCisgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmg9DQordWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhPQ0KK3JiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiID0NCitSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHU9DQorYmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyPQ0KK2IgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUj0NCitodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWI9DQorYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiPQ0KKyBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaD0NCit1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmE9DQorcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgPQ0KK1JodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiDQorDQorLS09LXRJZEdZVnN0UUpnaHlFREFUbkorLS0NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZS54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzNWJkNAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9leGFtcGxlLnhtbApAQCAtMCwwICsxLDIxMyBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorUmV0dXJuLVBhdGg6ICZsdDtyb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWsmZ3Q7PC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IChxbWFpbCAxODU1NCBpbnZva2VkIGZyb20gbmV0d29yayk7IDI1IE1heSAyMDA4IDE0OjM4OjUzIC0wMDAwPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IGZyb20gdW5rbm93biAoSEVMTyBwM3ByZXNtdHAwMS0xNi5wcm9kLnBoeDMuc2VjdXJlc2VydmVyLm5ldCkNCisgICAgICAgIChbMjA4LjEwOS44MC4xNjVdKSAoZW52ZWxvcGUtc2VuZGVyICZsdDtyZG9ua2luLW93bmVyQGxvY3VzLmFwYWNoZS5vcmcmZ3Q7KSBieQ0KKyAgICAgICAgc210cDIwLTAxLnByb2QubWVzYTEuc2VjdXJlc2VydmVyLm5ldCAocW1haWwtMS4wMykgd2l0aCBTTVRQIGZvcg0KKyAgICAgICAgJmx0O2FzZkB4bWxtYXB0Lm9yZyZndDs7IDI1IE1heSAyMDA4IDE0OjM4OjUzIC0wMDAwPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IChxbWFpbCA5NzUxIGludm9rZWQgZnJvbSBuZXR3b3JrKTsgMjUgTWF5IDIwMDggMTQ6Mzg6NTMgLTAwMDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogZnJvbSBtaW5vdGF1ci5hcGFjaGUub3JnIChbMTQwLjIxMS4xMS45XSkgKGVudmVsb3BlLXNlbmRlcg0KKyAgICAgICAgJmx0O3Jkb25raW4tb3duZXJAbG9jdXMuYXBhY2hlLm9yZyZndDspIGJ5DQorICAgICAgICBwM3ByZXNtdHAwMS0xNi5wcm9kLnBoeDMuc2VjdXJlc2VydmVyLm5ldCAocW1haWwtbGRhcC0xLjAzKSB3aXRoIFNNVFAgZm9yDQorICAgICAgICAmbHQ7YXNmQHhtbG1hcHQub3JnJmd0OzsgMjUgTWF5IDIwMDggMTQ6Mzg6NTAgLTAwMDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogKHFtYWlsIDQ2NzY4IGludm9rZWQgYnkgdWlkIDEyODkpOyAyNSBNYXkgMjAwOCAxNDozODo0NiAtMDAwMDwvZmllbGQ+DQorPGZpZWxkPg0KK0RlbGl2ZXJlZC1UbzogcmRvbmtpbkBsb2N1cy5hcGFjaGUub3JnPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IChxbWFpbCA0Njc2MyBpbnZva2VkIGZyb20gbmV0d29yayk7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IGZyb20gaGVybWVzLmFwYWNoZS5vcmcgKEhFTE8gbWFpbC5hcGFjaGUub3JnKSAoMTQwLjIxMS4xMS4yKSBieQ0KKyAgICAgICAgbWlub3RhdXIuYXBhY2hlLm9yZyB3aXRoIFNNVFA7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IChxbWFpbCA2MTI3NSBpbnZva2VkIGJ5IHVpZCA1MDApOyAyNSBNYXkgMjAwOCAxNDozODo0OCAtMDAwMDwvZmllbGQ+DQorPGZpZWxkPg0KK0RlbGl2ZXJlZC1UbzogYXBtYWlsLXJkb25raW5AYXBhY2hlLm9yZzwvZmllbGQ+DQorPGZpZWxkPg0KK0RlbGl2ZXJlZC1Ubzogcm9iQGxvY2FsaG9zdDwvZmllbGQ+DQorPGZpZWxkPg0KK0RlbGl2ZXJlZC1Ubzogcm9iQGxvY2FsaG9zdDwvZmllbGQ+DQorPGZpZWxkPg0KK1JlY2VpdmVkOiAocW1haWwgNjEyNzIgaW52b2tlZCBieSB1aWQgOTkpOyAyNSBNYXkgMjAwOCAxNDozODo0OCAtMDAwMDwvZmllbGQ+DQorPGZpZWxkPg0KK1JlY2VpdmVkOiBmcm9tIGF0aGVuYS5hcGFjaGUub3JnIChIRUxPIGF0aGVuYS5hcGFjaGUub3JnKSAoMTQwLjIxMS4xMS4xMzYpDQorICAgICAgICBieSBhcGFjaGUub3JnIChxcHNtdHBkLzAuMjkpIHdpdGggRVNNVFA7IFN1biwgMjUgTWF5IDIwMDggMDc6Mzg6NDggLTA3MDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitYLUFTRi1TcGFtLVN0YXR1czogTm8sIGhpdHM9LTAuMCByZXF1aXJlZD0xMC4wIHRlc3RzPVNQRl9QQVNTPC9maWVsZD4NCis8ZmllbGQ+DQorWC1TcGFtLUNoZWNrLUJ5OiBhcGFjaGUub3JnPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQtU1BGOiBwYXNzIChhdGhlbmEuYXBhY2hlLm9yZzogZG9tYWluIG9mDQorICAgICAgICByb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWsgZGVzaWduYXRlcyAxOTUuMTg4LjIxMy41IGFzIHBlcm1pdHRlZA0KKyAgICAgICAgc2VuZGVyKTwvZmllbGQ+DQorPGZpZWxkPg0KK1JlY2VpdmVkOiBmcm9tIFsxOTUuMTg4LjIxMy41XSAoSEVMTyBzbXRwLW91dDIuYmx1ZXlvbmRlci5jby51aykNCisgICAgICAgICgxOTUuMTg4LjIxMy41KSBieSBhcGFjaGUub3JnIChxcHNtdHBkLzAuMjkpIHdpdGggRVNNVFA7IFN1biwgMjUgTWF5IDIwMDgNCisgICAgICAgIDE0OjM4OjAwICswMDAwPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IGZyb20gWzE3Mi4yMy4xNzAuMTQwXSAoaGVsbz1hbnRpLXZpcnVzMDItMDcpIGJ5DQorICAgICAgICBzbXRwLW91dDIuYmx1ZXlvbmRlci5jby51ayB3aXRoIHNtdHAgKEV4aW0gNC41MikgaWQgMUswSE1WLTAwMDg3ZS1IWSBmb3INCisgICAgICAgIHJkb25raW5AYXBhY2hlLm9yZzsgU3VuLCAyNSBNYXkgMjAwOCAxNTozODoxNSArMDEwMDwvZmllbGQ+DQorPGZpZWxkPg0KK1JlY2VpdmVkOiBmcm9tIFs4Mi4zOC42NS42XSAoaGVsbz1bMTAuMC4wLjI3XSkgYnkNCisgICAgICAgIGFzbXRwLW91dDUuYmx1ZXlvbmRlci5jby51ayB3aXRoIGVzbXRwYSAoRXhpbSA0LjUyKSBpZCAxSzBITVUtMDAwMUEyLTNxIGZvcg0KKyAgICAgICAgcmRvbmtpbkBhcGFjaGUub3JnOyBTdW4sIDI1IE1heSAyMDA4IDE1OjM4OjE0ICswMTAwPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbXVsdGlwYXJ0IG1peGVkIGVtYWlsIHdpdGggaW1hZ2UgY29udGVudDwvZmllbGQ+DQorPGZpZWxkPg0KK0Zyb206IFJvYmVydCBCdXJyZWxsIERvbmtpbiAmbHQ7cm9iZXJ0YnVycmVsbGRvbmtpbkBibHVleW9uZGVyLmNvLnVrJmd0OzwvZmllbGQ+DQorPGZpZWxkPg0KK1RvOiBSb2JlcnQgQnVycmVsbCBEb25raW4gJmx0O3Jkb25raW5AYXBhY2hlLm9yZyZndDs8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij0tdElkR1lWc3RRSmdoeUVEQVRuSisiPC9maWVsZD4NCis8ZmllbGQ+DQorRGF0ZTogU3VuLCAyNSBNYXkgMjAwOCAxNTozODoxMyArMDEwMDwvZmllbGQ+DQorPGZpZWxkPg0KK01lc3NhZ2UtSWQ6ICZsdDsxMjExNzI2MjkzLjU3NzIuMTAuY2FtZWxAbG9jYWxob3N0Jmd0OzwvZmllbGQ+DQorPGZpZWxkPg0KK01pbWUtVmVyc2lvbjogMS4wPC9maWVsZD4NCis8ZmllbGQ+DQorWC1NYWlsZXI6IEV2b2x1dGlvbiAyLjEyLjMgPC9maWVsZD4NCis8ZmllbGQ+DQorWC1WaXJ1cy1DaGVja2VkOiBDaGVja2VkIGJ5IENsYW1BViBvbiBhcGFjaGUub3JnPC9maWVsZD4NCis8ZmllbGQ+DQorWC1Ob25zcGFtOiBOb25lPC9maWVsZD4NCis8ZmllbGQ+DQorWC1mZXRjaGVkLWZyb206IG1haWwueG1sbWFwdC5vcmc8L2ZpZWxkPg0KKzxmaWVsZD4NCitYLUV2b2x1dGlvbi1Tb3VyY2U6IGltYXA6Ly9yb2JAdGhlYmVzLzwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisNCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorIA0KK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCit1bmRlciB0aGUgTGljZW5zZS48L2JvZHk+DQorPC9ib2R5LXBhcnQ+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1ibG9iLnBuZzsNCisgICBtb2RpZmljYXRpb24tZGF0ZT0iU3VuLCAyMSBKdW4gMjAwOCAxNTozMjoxOCArMDAwMCI7IGNyZWF0aW9uLWRhdGU9IlNhdCwgMjAgSnVuIDIwMDggMTA6MTU6MDkgKzAwMDAiOyByZWFkLWRhdGU9Ik1vbiwgMjIgSnVuIDIwMDggMTI6MDg6NTYgKzAwMDAiO3NpemU9MTAyMzQ7PC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBpbWFnZS9wbmc7IG5hbWU9YmxvYi5wbmc8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBb0FBQUFLQ0FJQUFBQUNVRmpxQUFBQUFYTlNSMElBcnM0YzZRQUFBQWx3U0ZsekFBQUwNCitFd0FBQ3hNQkFKcWNHQUFBQUFkMFNVMUZCOWdGR1E0aUo5OXVmY1lBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvDQorSUVkSlRWQlhnUTRYQUFBQTBFbEVRVlFZMDJYTXdVckRRQmhGNFhzbmt5WWhqV0phQ2xvRU43Ny9hL2dFUlZ3SkxRaWlOalltYlRxWg0KKy83cUlHL1ZzUHppTVR3KzIzV2ovb3ZaZE1RSmdWaUN2V05WdXNmYTIzZGp1VWYybnVnYm5JMlJ5bmtXRjVhMkZ3ZHZyczdxOXZocUUNCitFMlFBRUlPNkJoWkJlclVmNmx1TXc0OU55VFIwT0x3NWtKRDlzcWs0SXB3YzZHQVJFdjVuNXBpWFRET1FmeTFKTVNzOFpnWEtxMmtGDQoraXdEZ0VyaUVlY25MbGVmRkVtR0FJdnFENGdnSkpOTU04NXFMdFhmWDl4WUd1RVErNC9rSWkwZzg4emxYZDY2KytRYVFERzVHUFp5cA0KK3JRQUFBQUJKUlU1RXJrSmdnZz09DQorDQorPC9ib2R5Pg0KKzwvYm9keS1wYXJ0Pg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9YmxvYi5wbmc8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IGltYWdlL3BuZzsgbmFtZT1ibG9iLnBuZzwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NDwvZmllbGQ+DQorPC9oZWFkZXI+DQorPGJvZHk+DQoraVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFvQUFBQUtDQUlBQUFBQ1VGanFBQUFBQVhOU1IwSUFyczRjNlFBQUFBbHdTRmx6QUFBTA0KK0V3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5Z0ZHUTRpSjk5dWZjWUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm8NCitJRWRKVFZCWGdRNFhBQUFBMEVsRVFWUVkwMlhNd1VyRFFCaEY0WHNua3lZaGpXSmFDbG9FTjc3L2EvZ0VSVndKTFFpaU5qWW1iVHFaDQorLzdxSUcvVnNQemlNVHcrMjNXai9vdlpkTVFKZ1ZpQ3ZXTlZ1c2ZhMjNkanVVZjJudWdibkkyUnlua1dGNWEyRndkdnJzN3E5dmhxRQ0KK0UyUUFFSU82QmhaQmVyVWY2bHVNdzQ5TnlUUjBPTHc1a0pEOXNxazRJcHdjNkdBUkV2NW41cGlYVERPUWZ5MUpNU3M4WmdYS3Eya0YNCitpd0RnRXJpRWVjbkxsZWZGRW1HQUl2cUQ0Z2dKSk5NTTg1cUx0WGZYOXhZR3VFUSs0L2tJaTBnODh6bFhkNjYrK1FhUURHNUdQWnlwDQorclFBQUFBQkpSVTVFcmtKZ2dnPT0NCisNCis8L2JvZHk+DQorPC9ib2R5LXBhcnQ+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1yaHViYXJiLnR4dDwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgbmFtZT1yaHViYXJiLnR4dDsgY2hhcnNldD11cy1hc2NpaTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtTGFuZ3VhZ2U6IGVuLCBlbi1VUywgZW4tQ0E8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlPC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHU9DQorYmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyPQ0KK2IgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUj0NCitodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWI9DQorYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiPQ0KKyBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaD0NCit1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmE9DQorcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgPQ0KK1JodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodT0NCitiYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXI9DQorYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSPQ0KK2h1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1Yj0NCithcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmI9DQorIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJoPQ0KK3ViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYT0NCityYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiA9DQorUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1PQ0KK2JhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcj0NCitiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFI9DQoraHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViPQ0KK2FyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYj0NCisgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmg9DQordWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhPQ0KK3JiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiID0NCitSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHU9DQorYmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyPQ0KK2IgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUj0NCitodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWI9DQorYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiPQ0KKyBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaD0NCit1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmE9DQorcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgPQ0KK1JodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodT0NCitiYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXI9DQorYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSPQ0KK2h1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1Yj0NCithcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmI9DQorIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJoPQ0KK3ViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYT0NCityYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiA9DQorUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmINCis8L2JvZHk+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KKzwvZXBpbG9ndWU+DQorPC9tdWx0aXBhcnQ+DQorPC9tZXNzYWdlPg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9leGFtcGxlX2RlY29kZWQueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2V4YW1wbGVfZGVjb2RlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhZDRlNAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9leGFtcGxlX2RlY29kZWQueG1sCkBAIC0wLDAgKzEsMTM3IEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitSZXR1cm4tUGF0aDogJmx0O3JvYmVydGJ1cnJlbGxkb25raW5AYmx1ZXlvbmRlci5jby51ayZndDs8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogKHFtYWlsIDE4NTU0IGludm9rZWQgZnJvbSBuZXR3b3JrKTsgMjUgTWF5IDIwMDggMTQ6Mzg6NTMgLTAwMDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogZnJvbSB1bmtub3duIChIRUxPIHAzcHJlc210cDAxLTE2LnByb2QucGh4My5zZWN1cmVzZXJ2ZXIubmV0KQ0KKyAgICAgICAgKFsyMDguMTA5LjgwLjE2NV0pIChlbnZlbG9wZS1zZW5kZXIgJmx0O3Jkb25raW4tb3duZXJAbG9jdXMuYXBhY2hlLm9yZyZndDspIGJ5DQorICAgICAgICBzbXRwMjAtMDEucHJvZC5tZXNhMS5zZWN1cmVzZXJ2ZXIubmV0IChxbWFpbC0xLjAzKSB3aXRoIFNNVFAgZm9yDQorICAgICAgICAmbHQ7YXNmQHhtbG1hcHQub3JnJmd0OzsgMjUgTWF5IDIwMDggMTQ6Mzg6NTMgLTAwMDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogKHFtYWlsIDk3NTEgaW52b2tlZCBmcm9tIG5ldHdvcmspOyAyNSBNYXkgMjAwOCAxNDozODo1MyAtMDAwMDwvZmllbGQ+DQorPGZpZWxkPg0KK1JlY2VpdmVkOiBmcm9tIG1pbm90YXVyLmFwYWNoZS5vcmcgKFsxNDAuMjExLjExLjldKSAoZW52ZWxvcGUtc2VuZGVyDQorICAgICAgICAmbHQ7cmRvbmtpbi1vd25lckBsb2N1cy5hcGFjaGUub3JnJmd0OykgYnkNCisgICAgICAgIHAzcHJlc210cDAxLTE2LnByb2QucGh4My5zZWN1cmVzZXJ2ZXIubmV0IChxbWFpbC1sZGFwLTEuMDMpIHdpdGggU01UUCBmb3INCisgICAgICAgICZsdDthc2ZAeG1sbWFwdC5vcmcmZ3Q7OyAyNSBNYXkgMjAwOCAxNDozODo1MCAtMDAwMDwvZmllbGQ+DQorPGZpZWxkPg0KK1JlY2VpdmVkOiAocW1haWwgNDY3NjggaW52b2tlZCBieSB1aWQgMTI4OSk7IDI1IE1heSAyMDA4IDE0OjM4OjQ2IC0wMDAwPC9maWVsZD4NCis8ZmllbGQ+DQorRGVsaXZlcmVkLVRvOiByZG9ua2luQGxvY3VzLmFwYWNoZS5vcmc8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogKHFtYWlsIDQ2NzYzIGludm9rZWQgZnJvbSBuZXR3b3JrKTsgMjUgTWF5IDIwMDggMTQ6Mzg6NDYgLTAwMDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogZnJvbSBoZXJtZXMuYXBhY2hlLm9yZyAoSEVMTyBtYWlsLmFwYWNoZS5vcmcpICgxNDAuMjExLjExLjIpIGJ5DQorICAgICAgICBtaW5vdGF1ci5hcGFjaGUub3JnIHdpdGggU01UUDsgMjUgTWF5IDIwMDggMTQ6Mzg6NDYgLTAwMDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogKHFtYWlsIDYxMjc1IGludm9rZWQgYnkgdWlkIDUwMCk7IDI1IE1heSAyMDA4IDE0OjM4OjQ4IC0wMDAwPC9maWVsZD4NCis8ZmllbGQ+DQorRGVsaXZlcmVkLVRvOiBhcG1haWwtcmRvbmtpbkBhcGFjaGUub3JnPC9maWVsZD4NCis8ZmllbGQ+DQorRGVsaXZlcmVkLVRvOiByb2JAbG9jYWxob3N0PC9maWVsZD4NCis8ZmllbGQ+DQorRGVsaXZlcmVkLVRvOiByb2JAbG9jYWxob3N0PC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IChxbWFpbCA2MTI3MiBpbnZva2VkIGJ5IHVpZCA5OSk7IDI1IE1heSAyMDA4IDE0OjM4OjQ4IC0wMDAwPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IGZyb20gYXRoZW5hLmFwYWNoZS5vcmcgKEhFTE8gYXRoZW5hLmFwYWNoZS5vcmcpICgxNDAuMjExLjExLjEzNikNCisgICAgICAgIGJ5IGFwYWNoZS5vcmcgKHFwc210cGQvMC4yOSkgd2l0aCBFU01UUDsgU3VuLCAyNSBNYXkgMjAwOCAwNzozODo0OCAtMDcwMDwvZmllbGQ+DQorPGZpZWxkPg0KK1gtQVNGLVNwYW0tU3RhdHVzOiBObywgaGl0cz0tMC4wIHJlcXVpcmVkPTEwLjAgdGVzdHM9U1BGX1BBU1M8L2ZpZWxkPg0KKzxmaWVsZD4NCitYLVNwYW0tQ2hlY2stQnk6IGFwYWNoZS5vcmc8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZC1TUEY6IHBhc3MgKGF0aGVuYS5hcGFjaGUub3JnOiBkb21haW4gb2YNCisgICAgICAgIHJvYmVydGJ1cnJlbGxkb25raW5AYmx1ZXlvbmRlci5jby51ayBkZXNpZ25hdGVzIDE5NS4xODguMjEzLjUgYXMgcGVybWl0dGVkDQorICAgICAgICBzZW5kZXIpPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IGZyb20gWzE5NS4xODguMjEzLjVdIChIRUxPIHNtdHAtb3V0Mi5ibHVleW9uZGVyLmNvLnVrKQ0KKyAgICAgICAgKDE5NS4xODguMjEzLjUpIGJ5IGFwYWNoZS5vcmcgKHFwc210cGQvMC4yOSkgd2l0aCBFU01UUDsgU3VuLCAyNSBNYXkgMjAwOA0KKyAgICAgICAgMTQ6Mzg6MDAgKzAwMDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitSZWNlaXZlZDogZnJvbSBbMTcyLjIzLjE3MC4xNDBdIChoZWxvPWFudGktdmlydXMwMi0wNykgYnkNCisgICAgICAgIHNtdHAtb3V0Mi5ibHVleW9uZGVyLmNvLnVrIHdpdGggc210cCAoRXhpbSA0LjUyKSBpZCAxSzBITVYtMDAwODdlLUhZIGZvcg0KKyAgICAgICAgcmRvbmtpbkBhcGFjaGUub3JnOyBTdW4sIDI1IE1heSAyMDA4IDE1OjM4OjE1ICswMTAwPC9maWVsZD4NCis8ZmllbGQ+DQorUmVjZWl2ZWQ6IGZyb20gWzgyLjM4LjY1LjZdIChoZWxvPVsxMC4wLjAuMjddKSBieQ0KKyAgICAgICAgYXNtdHAtb3V0NS5ibHVleW9uZGVyLmNvLnVrIHdpdGggZXNtdHBhIChFeGltIDQuNTIpIGlkIDFLMEhNVS0wMDAxQTItM3EgZm9yDQorICAgICAgICByZG9ua2luQGFwYWNoZS5vcmc7IFN1biwgMjUgTWF5IDIwMDggMTU6Mzg6MTQgKzAxMDA8L2ZpZWxkPg0KKzxmaWVsZD4NCitTdWJqZWN0OiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBtdWx0aXBhcnQgbWl4ZWQgZW1haWwgd2l0aCBpbWFnZSBjb250ZW50PC9maWVsZD4NCis8ZmllbGQ+DQorRnJvbTogUm9iZXJ0IEJ1cnJlbGwgRG9ua2luICZsdDtyb2JlcnRidXJyZWxsZG9ua2luQGJsdWV5b25kZXIuY28udWsmZ3Q7PC9maWVsZD4NCis8ZmllbGQ+DQorVG86IFJvYmVydCBCdXJyZWxsIERvbmtpbiAmbHQ7cmRvbmtpbkBhcGFjaGUub3JnJmd0OzwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iPS10SWRHWVZzdFFKZ2h5RURBVG5KKyI8L2ZpZWxkPg0KKzxmaWVsZD4NCitEYXRlOiBTdW4sIDI1IE1heSAyMDA4IDE1OjM4OjEzICswMTAwPC9maWVsZD4NCis8ZmllbGQ+DQorTWVzc2FnZS1JZDogJmx0OzEyMTE3MjYyOTMuNTc3Mi4xMC5jYW1lbEBsb2NhbGhvc3QmZ3Q7PC9maWVsZD4NCis8ZmllbGQ+DQorTWltZS1WZXJzaW9uOiAxLjA8L2ZpZWxkPg0KKzxmaWVsZD4NCitYLU1haWxlcjogRXZvbHV0aW9uIDIuMTIuMyA8L2ZpZWxkPg0KKzxmaWVsZD4NCitYLVZpcnVzLUNoZWNrZWQ6IENoZWNrZWQgYnkgQ2xhbUFWIG9uIGFwYWNoZS5vcmc8L2ZpZWxkPg0KKzxmaWVsZD4NCitYLU5vbnNwYW06IE5vbmU8L2ZpZWxkPg0KKzxmaWVsZD4NCitYLWZldGNoZWQtZnJvbTogbWFpbC54bWxtYXB0Lm9yZzwvZmllbGQ+DQorPGZpZWxkPg0KK1gtRXZvbHV0aW9uLVNvdXJjZTogaW1hcDovL3JvYkB0aGViZXMvPC9maWVsZD4NCis8L2hlYWRlcj4NCis8bXVsdGlwYXJ0Pg0KKzxwcmVhbWJsZT4NCis8L3ByZWFtYmxlPg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdDwvZmllbGQ+DQorPC9oZWFkZXI+DQorPHRleHQtYm9keSBuYW1lPSJleGFtcGxlX2RlY29kZWRfMV8xLnR4dCIvPg0KKzwvYm9keS1wYXJ0Pg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9YmxvYi5wbmc7DQorICAgbW9kaWZpY2F0aW9uLWRhdGU9IlN1biwgMjEgSnVuIDIwMDggMTU6MzI6MTggKzAwMDAiOyBjcmVhdGlvbi1kYXRlPSJTYXQsIDIwIEp1biAyMDA4IDEwOjE1OjA5ICswMDAwIjsgcmVhZC1kYXRlPSJNb24sIDIyIEp1biAyMDA4IDEyOjA4OjU2ICswMDAwIjtzaXplPTEwMjM0OzwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogaW1hZ2UvcG5nOyBuYW1lPWJsb2IucG5nPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8YmluYXJ5LWJvZHkgbmFtZT0iZXhhbXBsZV9kZWNvZGVkXzFfMi5iaW4iLz4NCis8L2JvZHktcGFydD4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPWJsb2IucG5nPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBpbWFnZS9wbmc7IG5hbWU9YmxvYi5wbmc8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxiaW5hcnktYm9keSBuYW1lPSJleGFtcGxlX2RlY29kZWRfMV8zLmJpbiIvPg0KKzwvYm9keS1wYXJ0Pg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9cmh1YmFyYi50eHQ8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IG5hbWU9cmh1YmFyYi50eHQ7IGNoYXJzZXQ9dXMtYXNjaWk8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LUxhbmd1YWdlOiBlbiwgZW4tVVMsIGVuLUNBPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZTwvZmllbGQ+DQorPC9oZWFkZXI+DQorPHRleHQtYm9keSBuYW1lPSJleGFtcGxlX2RlY29kZWRfMV80LnR4dCIvPg0KKzwvYm9keS1wYXJ0Pg0KKzxlcGlsb2d1ZT4NCis8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZV9kZWNvZGVkXzFfMS50eHQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZV9kZWNvZGVkXzFfMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxNzg0NwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9leGFtcGxlX2RlY29kZWRfMV8xLnR4dApAQCAtMCwwICsxLDE2IEBACitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorDQorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyANCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQordW5kZXIgdGhlIExpY2Vuc2UuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2V4YW1wbGVfZGVjb2RlZF8xXzIuYmluIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2V4YW1wbGVfZGVjb2RlZF8xXzIuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOGJiODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZV9kZWNvZGVkXzFfMi5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2V4YW1wbGVfZGVjb2RlZF8xXzMuYmluIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2V4YW1wbGVfZGVjb2RlZF8xXzMuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOGJiODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZV9kZWNvZGVkXzFfMy5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2V4YW1wbGVfZGVjb2RlZF8xXzQudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2V4YW1wbGVfZGVjb2RlZF8xXzQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOWQ0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvZXhhbXBsZV9kZWNvZGVkXzFfNC50eHQKQEAgLTAsMCArMSBAQAorUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmIgUmh1YmFyYiBSaHViYXJiIFJodWJhcmINCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvaW50ZXJtZWRpYXRlLWJvdW5kYXJpZXMubXNnIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2ludGVybWVkaWF0ZS1ib3VuZGFyaWVzLm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJkMTVhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2ludGVybWVkaWF0ZS1ib3VuZGFyaWVzLm1zZwpAQCAtMCwwICsxLDM2IEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9ImJvdW5kYXJ5Ig0KKw0KK3ByZWFtYmxlDQorDQorLS1ib3VuZGFyeQ0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbg0KKw0KK2ZpcnN0IHBhcnQNCisNCistLWJvdW5kYXJ5ICAgIA0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbg0KKw0KK2Zyb20gdGhlIHJmYzoNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK2VuY2Fwc3VsYXRpb24gOj0gZGVsaW1pdGVyIHRyYW5zcG9ydC1wYWRkaW5nDQorICAgICAgICAgICAgICAgICAgICAgIENSTEYgYm9keS1wYXJ0DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCithbmQgYWxzbw0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIkNvbXBvc2VycyBNVVNUIE5PVCBnZW5lcmF0ZSBub24temVybyBsZW5ndGggdHJhbnNwb3J0DQorcGFkZGluZywgYnV0IHJlY2VpdmVycyBNVVNUIGJlIGFibGUgdG8gaGFuZGxlIHBhZGRpbmcNCithZGRlZCBieSBtZXNzYWdlIHRyYW5zcG9ydHMuIg0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorc2Vjb25kIHBhcnQgaGF2ZSBhIHN0YXJ0IGJvdW5kYXJ5IGVuZGluZyB3aXRoIHNwYWNlcw0KK2FuZCBhbHNvIGhhdmUgYSBib3VuZGFyeSBub3QgYXQgdGhlIGJlZ2lubmluZw0KKyAtLWJvdW5kYXJ5DQorLi4uIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQNCisNCithbHNvIGEgYm91bmRhcnkgd2l0aCBtb3JlIGRhdGEgKGEgdGFiKSBzaG91ZCBiZSBpZ25vcmVkDQorIC0tYm91bmRhcnkJDQorIA0KK2VuZCBvZiBwYXJ0DQorDQorLS1ib3VuZGFyeS0tDQorZXBpbG91Z2UKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvaW50ZXJtZWRpYXRlLWJvdW5kYXJpZXMub3V0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2ludGVybWVkaWF0ZS1ib3VuZGFyaWVzLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2UwNmMwCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2ludGVybWVkaWF0ZS1ib3VuZGFyaWVzLm91dApAQCAtMCwwICsxLDM2IEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9ImJvdW5kYXJ5Ig0KKw0KK3ByZWFtYmxlDQorDQorLS1ib3VuZGFyeQ0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbg0KKw0KK2ZpcnN0IHBhcnQNCisNCistLWJvdW5kYXJ5DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQorDQorZnJvbSB0aGUgcmZjOg0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorZW5jYXBzdWxhdGlvbiA6PSBkZWxpbWl0ZXIgdHJhbnNwb3J0LXBhZGRpbmcNCisgICAgICAgICAgICAgICAgICAgICAgQ1JMRiBib2R5LXBhcnQNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK2FuZCBhbHNvDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisiQ29tcG9zZXJzIE1VU1QgTk9UIGdlbmVyYXRlIG5vbi16ZXJvIGxlbmd0aCB0cmFuc3BvcnQNCitwYWRkaW5nLCBidXQgcmVjZWl2ZXJzIE1VU1QgYmUgYWJsZSB0byBoYW5kbGUgcGFkZGluZw0KK2FkZGVkIGJ5IG1lc3NhZ2UgdHJhbnNwb3J0cy4iDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCisNCitzZWNvbmQgcGFydCBoYXZlIGEgc3RhcnQgYm91bmRhcnkgZW5kaW5nIHdpdGggc3BhY2VzDQorYW5kIGFsc28gaGF2ZSBhIGJvdW5kYXJ5IG5vdCBhdCB0aGUgYmVnaW5uaW5nDQorIC0tYm91bmRhcnkNCisuLi4gdGhhdCBzaG91bGQgYmUgaWdub3JlZA0KKw0KK2Fsc28gYSBib3VuZGFyeSB3aXRoIG1vcmUgZGF0YSAoYSB0YWIpIHNob3VkIGJlIGlnbm9yZWQNCisgLS1ib3VuZGFyeQkNCisgDQorZW5kIG9mIHBhcnQNCisNCistLWJvdW5kYXJ5LS0NCitlcGlsb3VnZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9pbnRlcm1lZGlhdGUtYm91bmRhcmllcy54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvaW50ZXJtZWRpYXRlLWJvdW5kYXJpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NGQ5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvaW50ZXJtZWRpYXRlLWJvdW5kYXJpZXMueG1sCkBAIC0wLDAgKzEsNTEgQEAKKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iYm91bmRhcnkiPC9maWVsZD4NCis8L2hlYWRlcj4NCis8bXVsdGlwYXJ0Pg0KKzxwcmVhbWJsZT4NCitwcmVhbWJsZQ0KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW48L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK2ZpcnN0IHBhcnQNCis8L2JvZHk+DQorPC9ib2R5LXBhcnQ+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW48L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK2Zyb20gdGhlIHJmYzoNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK2VuY2Fwc3VsYXRpb24gOj0gZGVsaW1pdGVyIHRyYW5zcG9ydC1wYWRkaW5nDQorICAgICAgICAgICAgICAgICAgICAgIENSTEYgYm9keS1wYXJ0DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCithbmQgYWxzbw0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIkNvbXBvc2VycyBNVVNUIE5PVCBnZW5lcmF0ZSBub24temVybyBsZW5ndGggdHJhbnNwb3J0DQorcGFkZGluZywgYnV0IHJlY2VpdmVycyBNVVNUIGJlIGFibGUgdG8gaGFuZGxlIHBhZGRpbmcNCithZGRlZCBieSBtZXNzYWdlIHRyYW5zcG9ydHMuIg0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorc2Vjb25kIHBhcnQgaGF2ZSBhIHN0YXJ0IGJvdW5kYXJ5IGVuZGluZyB3aXRoIHNwYWNlcw0KK2FuZCBhbHNvIGhhdmUgYSBib3VuZGFyeSBub3QgYXQgdGhlIGJlZ2lubmluZw0KKyAtLWJvdW5kYXJ5DQorLi4uIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQNCisNCithbHNvIGEgYm91bmRhcnkgd2l0aCBtb3JlIGRhdGEgKGEgdGFiKSBzaG91ZCBiZSBpZ25vcmVkDQorIC0tYm91bmRhcnkJDQorIA0KK2VuZCBvZiBwYXJ0DQorPC9ib2R5Pg0KKzwvYm9keS1wYXJ0Pg0KKzxlcGlsb2d1ZT4NCitlcGlsb3VnZTwvZXBpbG9ndWU+DQorPC9tdWx0aXBhcnQ+DQorPC9tZXNzYWdlPg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9pbnRlcm1lZGlhdGUtYm91bmRhcmllc19kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9pbnRlcm1lZGlhdGUtYm91bmRhcmllc19kZWNvZGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc2OTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2ludGVybWVkaWF0ZS1ib3VuZGFyaWVzX2RlY29kZWQueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iYm91bmRhcnkiPC9maWVsZD4NCis8L2hlYWRlcj4NCis8bXVsdGlwYXJ0Pg0KKzxwcmVhbWJsZT4NCitwcmVhbWJsZQ0KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW48L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0iaW50ZXJtZWRpYXRlLWJvdW5kYXJpZXNfZGVjb2RlZF8xXzEudHh0Ii8+DQorPC9ib2R5LXBhcnQ+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW48L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0iaW50ZXJtZWRpYXRlLWJvdW5kYXJpZXNfZGVjb2RlZF8xXzIudHh0Ii8+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KK2VwaWxvdWdlPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL2ludGVybWVkaWF0ZS1ib3VuZGFyaWVzX2RlY29kZWRfMV8xLnR4dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9pbnRlcm1lZGlhdGUtYm91bmRhcmllc19kZWNvZGVkXzFfMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRkNzQzNAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9pbnRlcm1lZGlhdGUtYm91bmRhcmllc19kZWNvZGVkXzFfMS50eHQKQEAgLTAsMCArMSBAQAorZmlyc3QgcGFydA0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9pbnRlcm1lZGlhdGUtYm91bmRhcmllc19kZWNvZGVkXzFfMi50eHQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvaW50ZXJtZWRpYXRlLWJvdW5kYXJpZXNfZGVjb2RlZF8xXzIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MWY0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvaW50ZXJtZWRpYXRlLWJvdW5kYXJpZXNfZGVjb2RlZF8xXzIudHh0CkBAIC0wLDAgKzEsMjEgQEAKK2Zyb20gdGhlIHJmYzoNCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KK2VuY2Fwc3VsYXRpb24gOj0gZGVsaW1pdGVyIHRyYW5zcG9ydC1wYWRkaW5nDQorICAgICAgICAgICAgICAgICAgICAgIENSTEYgYm9keS1wYXJ0DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCithbmQgYWxzbw0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorIkNvbXBvc2VycyBNVVNUIE5PVCBnZW5lcmF0ZSBub24temVybyBsZW5ndGggdHJhbnNwb3J0DQorcGFkZGluZywgYnV0IHJlY2VpdmVycyBNVVNUIGJlIGFibGUgdG8gaGFuZGxlIHBhZGRpbmcNCithZGRlZCBieSBtZXNzYWdlIHRyYW5zcG9ydHMuIg0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorc2Vjb25kIHBhcnQgaGF2ZSBhIHN0YXJ0IGJvdW5kYXJ5IGVuZGluZyB3aXRoIHNwYWNlcw0KK2FuZCBhbHNvIGhhdmUgYSBib3VuZGFyeSBub3QgYXQgdGhlIGJlZ2lubmluZw0KKyAtLWJvdW5kYXJ5DQorLi4uIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQNCisNCithbHNvIGEgYm91bmRhcnkgd2l0aCBtb3JlIGRhdGEgKGEgdGFiKSBzaG91ZCBiZSBpZ25vcmVkDQorIC0tYm91bmRhcnkJDQorIA0KK2VuZCBvZiBwYXJ0DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3BsYWNlZC1ib3VuZGFyeS5tc2cgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzcGxhY2VkLWJvdW5kYXJ5Lm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWQzMjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3BsYWNlZC1ib3VuZGFyeS5tc2cKQEAgLTAsMCArMSwxMCBAQAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJib3VuZGFyeSINCisNCistLWJvdW5kYXJ5DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQorDQorVGhpcyBzaG91bGQgYmUgYSB0ZXh0IGluY2x1ZGluZyB0aGUgLS1ib3VuZGFyeQ0KK3N0cmluZyBhbmQgc2hvdWxkIG5vdCBiZSBwYXJzZWQgYXMgbXVsdGlwbGUgYm9kaWVzDQorDQorLS1ib3VuZGFyeS0tDQorZXBpbG91Z2UNCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzcGxhY2VkLWJvdW5kYXJ5Lm91dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNwbGFjZWQtYm91bmRhcnkub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNGM4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzcGxhY2VkLWJvdW5kYXJ5Lm91dApAQCAtMCwwICsxLDExIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9ImJvdW5kYXJ5Ig0KKw0KKw0KKy0tYm91bmRhcnkNCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4NCisNCitUaGlzIHNob3VsZCBiZSBhIHRleHQgaW5jbHVkaW5nIHRoZSAtLWJvdW5kYXJ5DQorc3RyaW5nIGFuZCBzaG91bGQgbm90IGJlIHBhcnNlZCBhcyBtdWx0aXBsZSBib2RpZXMNCisNCistLWJvdW5kYXJ5LS0NCitlcGlsb3VnZQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNwbGFjZWQtYm91bmRhcnkueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3BsYWNlZC1ib3VuZGFyeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk4Mjg0YQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNwbGFjZWQtYm91bmRhcnkueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iYm91bmRhcnkiPC9maWVsZD4NCis8L2hlYWRlcj4NCis8bXVsdGlwYXJ0Pg0KKzxwcmVhbWJsZT4NCis8L3ByZWFtYmxlPg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluPC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitUaGlzIHNob3VsZCBiZSBhIHRleHQgaW5jbHVkaW5nIHRoZSAtLWJvdW5kYXJ5DQorc3RyaW5nIGFuZCBzaG91bGQgbm90IGJlIHBhcnNlZCBhcyBtdWx0aXBsZSBib2RpZXMNCis8L2JvZHk+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KK2VwaWxvdWdlDQorPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3BsYWNlZC1ib3VuZGFyeV9kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNwbGFjZWQtYm91bmRhcnlfZGVjb2RlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNzM0MgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNwbGFjZWQtYm91bmRhcnlfZGVjb2RlZC54bWwKQEAgLTAsMCArMSwyMCBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJib3VuZGFyeSI8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtdWx0aXBhcnQ+DQorPHByZWFtYmxlPg0KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW48L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0ibWlzcGxhY2VkLWJvdW5kYXJ5X2RlY29kZWRfMV8xLnR4dCIvPg0KKzwvYm9keS1wYXJ0Pg0KKzxlcGlsb2d1ZT4NCitlcGlsb3VnZQ0KKzwvZXBpbG9ndWU+DQorPC9tdWx0aXBhcnQ+DQorPC9tZXNzYWdlPg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNwbGFjZWQtYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3BsYWNlZC1ib3VuZGFyeV9kZWNvZGVkXzFfMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkYWI2NQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNwbGFjZWQtYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0CkBAIC0wLDAgKzEsMiBAQAorVGhpcyBzaG91bGQgYmUgYSB0ZXh0IGluY2x1ZGluZyB0aGUgLS1ib3VuZGFyeQ0KK3N0cmluZyBhbmQgc2hvdWxkIG5vdCBiZSBwYXJzZWQgYXMgbXVsdGlwbGUgYm9kaWVzDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnkubXNnIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnkubXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWY4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzc2luZy1pbm5lci1ib3VuZGFyeS5tc2cKQEAgLTAsMCArMSwxNiBAQAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJvdXRlci1ib3VuZGFyeSINCisNCitPdXRlciBwcmVhbWJsZQ0KKw0KKy0tb3V0ZXItYm91bmRhcnkNCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4NCisNCitGb28NCisNCistLW91dGVyLWJvdW5kYXJ5DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSJpbm5lci1ib3VuZGFyeSINCisNCitBQUENCisNCistLW91dGVyLWJvdW5kYXJ5LS0NCitPdXRlciBlcGlsb3VnZQ0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNzaW5nLWlubmVyLWJvdW5kYXJ5Lm91dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNzaW5nLWlubmVyLWJvdW5kYXJ5Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDEzNDRkCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnkub3V0CkBAIC0wLDAgKzEsMjEgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0ib3V0ZXItYm91bmRhcnkiDQorDQorT3V0ZXIgcHJlYW1ibGUNCisNCistLW91dGVyLWJvdW5kYXJ5DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQorDQorRm9vDQorDQorLS1vdXRlci1ib3VuZGFyeQ0KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iaW5uZXItYm91bmRhcnkiDQorDQorQUFBDQorDQorLS1pbm5lci1ib3VuZGFyeQ0KKw0KKw0KKy0taW5uZXItYm91bmRhcnktLQ0KKw0KKy0tb3V0ZXItYm91bmRhcnktLQ0KK091dGVyIGVwaWxvdWdlDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnkueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjU5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzc2luZy1pbm5lci1ib3VuZGFyeS54bWwKQEAgLTAsMCArMSw0MiBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJvdXRlci1ib3VuZGFyeSI8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtdWx0aXBhcnQ+DQorPHByZWFtYmxlPg0KK091dGVyIHByZWFtYmxlDQorPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPGJvZHk+DQorRm9vDQorPC9ib2R5Pg0KKzwvYm9keS1wYXJ0Pg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSJpbm5lci1ib3VuZGFyeSI8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtdWx0aXBhcnQ+DQorPHByZWFtYmxlPg0KK0FBQQ0KKzwvcHJlYW1ibGU+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KKzwvYm9keT4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorT3V0ZXIgZXBpbG91Z2UNCis8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzc2luZy1pbm5lci1ib3VuZGFyeV9kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9taXNzaW5nLWlubmVyLWJvdW5kYXJ5X2RlY29kZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NWMzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzc2luZy1pbm5lci1ib3VuZGFyeV9kZWNvZGVkLnhtbApAQCAtMCwwICsxLDM5IEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Im91dGVyLWJvdW5kYXJ5IjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorT3V0ZXIgcHJlYW1ibGUNCis8L3ByZWFtYmxlPg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluPC9maWVsZD4NCis8L2hlYWRlcj4NCis8dGV4dC1ib2R5IG5hbWU9Im1pc3NpbmctaW5uZXItYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0Ii8+DQorPC9ib2R5LXBhcnQ+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9ImlubmVyLWJvdW5kYXJ5IjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorQUFBDQorPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPC9oZWFkZXI+DQorPHRleHQtYm9keSBuYW1lPSJtaXNzaW5nLWlubmVyLWJvdW5kYXJ5X2RlY29kZWRfMV8yXzEudHh0Ii8+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KKzwvZXBpbG9ndWU+DQorPC9tdWx0aXBhcnQ+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KK091dGVyIGVwaWxvdWdlDQorPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGM3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzc2luZy1pbm5lci1ib3VuZGFyeV9kZWNvZGVkXzFfMS50eHQKQEAgLTAsMCArMSBAQAorRm9vDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnlfZGVjb2RlZF8xXzJfMS50eHQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvbWlzc2luZy1pbm5lci1ib3VuZGFyeV9kZWNvZGVkXzFfMl8xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL21pc3NpbmctaW5uZXItYm91bmRhcnlfZGVjb2RlZF8xXzJfMS50eHQKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9xcC1ib2R5Lm1zZyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9xcC1ib2R5Lm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjFmYWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3FwLWJvZHkubXNnCkBAIC0wLDAgKzEsNiBAQAorTWltZS1WZXJzaW9uOiAxLjANCitTdWJqZWN0OiBzdWJqZWN0DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xNSINCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlDQorDQorN2JpdCBjb250ZW50IHdpdGggZXVybyA9QTQgc3ltYm9sPTIwDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3FwLWJvZHkub3V0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3FwLWJvZHkub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMWZhZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvcXAtYm9keS5vdXQKQEAgLTAsMCArMSw2IEBACitNaW1lLVZlcnNpb246IDEuMA0KK1N1YmplY3Q6IHN1YmplY3QNCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTE1Ig0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUNCisNCis3Yml0IGNvbnRlbnQgd2l0aCBldXJvID1BNCBzeW1ib2w9MjANCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvcXAtYm9keS54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvcXAtYm9keS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNDMwMwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9xcC1ib2R5LnhtbApAQCAtMCwwICsxLDE1IEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitNaW1lLVZlcnNpb246IDEuMDwvZmllbGQ+DQorPGZpZWxkPg0KK1N1YmplY3Q6IHN1YmplY3Q8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTE1IjwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGU8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KKzdiaXQgY29udGVudCB3aXRoIGV1cm8gPUE0IHN5bWJvbD0yMA0KKzwvYm9keT4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3FwLWJvZHlfZGVjb2RlZC54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvcXAtYm9keV9kZWNvZGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ZlMWZmCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3FwLWJvZHlfZGVjb2RlZC54bWwKQEAgLTAsMCArMSwxMyBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorTWltZS1WZXJzaW9uOiAxLjA8L2ZpZWxkPg0KKzxmaWVsZD4NCitTdWJqZWN0OiBzdWJqZWN0PC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xNSI8L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlPC9maWVsZD4NCis8L2hlYWRlcj4NCis8dGV4dC1ib2R5IG5hbWU9InFwLWJvZHlfZGVjb2RlZF8xLnR4dCIvPg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvcXAtYm9keV9kZWNvZGVkXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3FwLWJvZHlfZGVjb2RlZF8xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjJhY2QyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3FwLWJvZHlfZGVjb2RlZF8xLnR4dApAQCAtMCwwICsxIEBACis3Yml0IGNvbnRlbnQgd2l0aCBldXJvIKQgc3ltYm9sIA0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9ydXNzaWFuLWhlYWRlcnMubXNnIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3J1c3NpYW4taGVhZGVycy5tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3NGY5MwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9ydXNzaWFuLWhlYWRlcnMubXNnCkBAIC0wLDAgKzEsNSBAQAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVUy1BU0NJSSI7IG5hbWU9PT9rb2k4LXI/Qj84OURKMDgvTExtUnZZdz09Pz0NCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT09P2tvaTgtcj9CPzg5REowOC9MTG1Sdll3PT0/PQ0KK1N1YmplY3Q6IEEgc2ltcGxlIHN1YmplY3QNCisNCitBIHNpbXBsZSBib2R5Lg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9ydXNzaWFuLWhlYWRlcnMub3V0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3J1c3NpYW4taGVhZGVycy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3NGY5MwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9ydXNzaWFuLWhlYWRlcnMub3V0CkBAIC0wLDAgKzEsNSBAQAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVUy1BU0NJSSI7IG5hbWU9PT9rb2k4LXI/Qj84OURKMDgvTExtUnZZdz09Pz0NCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT09P2tvaTgtcj9CPzg5REowOC9MTG1Sdll3PT0/PQ0KK1N1YmplY3Q6IEEgc2ltcGxlIHN1YmplY3QNCisNCitBIHNpbXBsZSBib2R5Lg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9ydXNzaWFuLWhlYWRlcnMueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3J1c3NpYW4taGVhZGVycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhNzI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9ydXNzaWFuLWhlYWRlcnMueG1sCkBAIC0wLDAgKzEsMTMgQEAKKzxtZXNzYWdlPg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iVVMtQVNDSUkiOyBuYW1lPT0/a29pOC1yP0I/ODlESjA4L0xMbVJ2WXc9PT89PC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9PT9rb2k4LXI/Qj84OURKMDgvTExtUnZZdz09Pz08L2ZpZWxkPg0KKzxmaWVsZD4NCitTdWJqZWN0OiBBIHNpbXBsZSBzdWJqZWN0PC9maWVsZD4NCis8L2hlYWRlcj4NCis8Ym9keT4NCitBIHNpbXBsZSBib2R5Lg0KKzwvYm9keT4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3J1c3NpYW4taGVhZGVyc19kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9ydXNzaWFuLWhlYWRlcnNfZGVjb2RlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2NGI2NAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9ydXNzaWFuLWhlYWRlcnNfZGVjb2RlZC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJVUy1BU0NJSSI7IG5hbWU9PT9rb2k4LXI/Qj84OURKMDgvTExtUnZZdz09Pz08L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT09P2tvaTgtcj9CPzg5REowOC9MTG1Sdll3PT0/PTwvZmllbGQ+DQorPGZpZWxkPg0KK1N1YmplY3Q6IEEgc2ltcGxlIHN1YmplY3Q8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0icnVzc2lhbi1oZWFkZXJzX2RlY29kZWRfMS50eHQiLz4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3J1c3NpYW4taGVhZGVyc19kZWNvZGVkXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3J1c3NpYW4taGVhZGVyc19kZWNvZGVkXzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODEyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvcnVzc2lhbi1oZWFkZXJzX2RlY29kZWRfMS50eHQKQEAgLTAsMCArMSBAQAorQSBzaW1wbGUgYm9keS4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvc2ltcGxlLWF0dGFjaG1lbnQubXNnIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3NpbXBsZS1hdHRhY2htZW50Lm1zZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWUwZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3NpbXBsZS1hdHRhY2htZW50Lm1zZwpAQCAtMCwwICsxLDQzIEBACitEYXRlOiBGcmksIDI3IEFwciAyMDA3IDE2OjA4OjIzICswMjAwDQorRnJvbTogRm9vIEJhciA8YmFyQGV4YW1wbGUuY29tPg0KK01JTUUtVmVyc2lvbjogMS4wDQorVG86ICBmb29AZXhhbXBsZS5jb20NCitTdWJqZWN0OiBIZXJlIGlzIHRoZSBhdHRhY2htZW50IEkgd2FzIHdhaXRpbmcgZm9yLg0KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOw0KKyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tMDkwNDA0MDgwNDA1MDgwMTA4MDAwOTA5Ig0KKw0KK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuDQorLS0tLS0tLS0tLS0tLS0wOTA0MDQwODA0MDUwODAxMDgwMDA5MDkNCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMTUNCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQorDQorQm9keS4NCisNCistLS0tLS0tLS0tLS0tLTA5MDQwNDA4MDQwNTA4MDEwODAwMDkwOQ0KK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtOw0KKyBuYW1lPSJkYXRhLmJpbiINCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQNCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50Ow0KKyBmaWxlbmFtZT0iZGF0YS5iaW4iDQorDQorbEx6bXlRakJDMmd3L2hpVXJjeS9EREk1SzZDQnFGU3M0TktDRjY3RzVYQnpPblNJbldwWis5VXY5SXhGcHo4cmY4NzF4QUUrDQorK3kwWllFUzlMWERkUDEyc3Z4c0o0aFJzZWtIMkhKOTUzS2dsYjNoeGtvN0xsUGx4ZURYMTVGS0gwVkJFOEdncjRSYndvUCtjDQorbWt5eWhLeWFpVjk1eWNSelJkNW96VkRHaG1XL2VRSVpndzNuWUpPdDk5dnlQeG9sa0hEOFBMZXZteDRQVHRlSU80aElXakhHDQorWHRLQ1ROd0JHMHo0Y1czRU9IV3hzdm81djZKVUV1ZURheGZGV0tyQS9NV1AyVGtZUkVYTWorcTBYQzRNcEtaZ0lqcVJMLzlFDQorczZncXBKVGI0ZXlZTDZGQmRnck5lTHFEUTVvemd1MXphUWk5K3l1b0NBQklIS0NFUHYzMlcrOVd0L01qTXFDbktkaytaZHN3DQorWkJuYTBGcS8xNjhvcUtoMFMrK3RycGduZEh2V1pXb2pOWStyRHFubDVvM1Q5SXZUZ1R1RzhJSFBTeFVPRGJXRnkxdmltK2pVDQorZUdOcENma282REdvNW9CQ0t6ZzVCVGx6MmtBRUQ2RjFYNi9hK3cwLzl6R0paSjlUeWc2ZmI4TEU3T3dERnAxcEg5OXg2U2dSDQoreGErSUZIb1hoYmpSemtSaS9aUlpLcnFtNGp4dmhGVFhseDl3NzBTTDBHYXdIVXd1Tk9nRVVLSk03NUFEbURFRXRSQjBwUThTDQorUlBvS24vYjFSTEdRUHN2SHpjcXRTSmxqZ2JNTUJtb2lCRmtBbnpvcG5WbjFSSmZCekk2eDlZY1h0TnF0SkNUWGRIelBnNEQrDQorV2h3a0NCMEFGN1c4RW9WcXZtbFAyZzB2QWRQejRnUjgrSTZBRmRHUXRDNTJDTWhYLzFtSEFlVGpEQ251dlR6WnZLckFDY1ZCDQorOUVhMTJ3MTBLTFlic2dBcjIrMnZmQWRpTFVkVVpES0hQUHRXQytsU3J2a1RKdGl2VStZT1N3N1BDa1dGN0JJQzdwVGRwN1d1DQordHFHQ21WbzBlSEtmSnhYY3BrSCsrOUFMZUFROHRmUXc5SzIwSkpXMThmU0F3L2hzOGZ4czVGV2poTnBZcFV2UWxxem5OOThLDQorL3BuYVhRbzM3M051ZllIeTEreVQzc1NWRXdCYkNsdjd5T2pyWXJteVJlNm9qdytaeFh6aVdrOHIrVmtGcG90d3ZnVzQxdk91DQordmtoZDk0cnpyMU1qN1dORXNzVHJKT1FDNVVkYTJEUFprSGd4QmJaY2gycnU2NUptaXZyNDkzaVRGMTU3YzZNWmhKVVNXK1A1DQorWGQrV29EclV3emNwTXg3UWR5WmFOU1BWc0w3dUQ0eE9Lb3FtNE9jZHl6RWo0cXFEdkJMQTBUSjhzUTRGcDBBNWg3bk5UdW9VDQordnhLTWFuMEo0clJLYzdUNGVzd3VMRWFUUENEdEtwc21sVFMrckc0alBhQ09sUE0rK3FySTZWTWdKQlpPTC96RzdtTHViL0lZDQorS21VNlN2ZWx5azkxWFFGMjNkaGJTcWxMamVMbEdqd3RsSGhxUnVGQVNWSWdJcWN4YnNyeGE2Q1NtVHJIbXhyME5VNWhtRVdiDQorbEJQdlp3WVpoWk11MmMveVRpcnZrbklpanlUUmpGbWd3cEI3M3VKSHYwb1FvdEM2bXlYVEdOQ2MwTWloQk1Pc0RRczNGaHNsDQorSkZRY0g2VkEwYnplL0ZTWm9HaStzTTkwbHlydWZRbmdlblYxRVZwdEZCeDVEUVlXRVdYS09pMlpTNkpRR1lSaDFSK0VYQT09DQorLS0tLS0tLS0tLS0tLS0wOTA0MDQwODA0MDUwODAxMDgwMDA5MDktLQ0KKw0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9zaW1wbGUtYXR0YWNobWVudC5vdXQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvc2ltcGxlLWF0dGFjaG1lbnQub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjU5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvc2ltcGxlLWF0dGFjaG1lbnQub3V0CkBAIC0wLDAgKzEsNDMgQEAKK0RhdGU6IEZyaSwgMjcgQXByIDIwMDcgMTY6MDg6MjMgKzAyMDANCitGcm9tOiBGb28gQmFyIDxiYXJAZXhhbXBsZS5jb20+DQorTUlNRS1WZXJzaW9uOiAxLjANCitUbzogIGZvb0BleGFtcGxlLmNvbQ0KK1N1YmplY3Q6IEhlcmUgaXMgdGhlIGF0dGFjaG1lbnQgSSB3YXMgd2FpdGluZyBmb3IuDQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7DQorIGJvdW5kYXJ5PSItLS0tLS0tLS0tLS0wOTA0MDQwODA0MDUwODAxMDgwMDA5MDkiDQorDQorVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4NCistLS0tLS0tLS0tLS0tLTA5MDQwNDA4MDQwNTA4MDEwODAwMDkwOQ0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNQ0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQNCisNCitCb2R5Lg0KKw0KKy0tLS0tLS0tLS0tLS0tMDkwNDA0MDgwNDA1MDgwMTA4MDAwOTA5DQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07DQorIG5hbWU9ImRhdGEuYmluIg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NA0KK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7DQorIGZpbGVuYW1lPSJkYXRhLmJpbiINCisNCitsTHpteVFqQkMyZ3cvaGlVcmN5L0RESTVLNkNCcUZTczROS0NGNjdHNVhCek9uU0luV3BaKzlVdjlJeEZwejhyZjg3MXhBRSsreTBaDQorWUVTOUxYRGRQMTJzdnhzSjRoUnNla0gySEo5NTNLZ2xiM2h4a283TGxQbHhlRFgxNUZLSDBWQkU4R2dyNFJid29QK2Nta3l5aEt5YQ0KK2lWOTV5Y1J6UmQ1b3pWREdobVcvZVFJWmd3M25ZSk90OTl2eVB4b2xrSEQ4UExldm14NFBUdGVJTzRoSVdqSEdYdEtDVE53QkcwejQNCitjVzNFT0hXeHN2bzV2NkpVRXVlRGF4ZkZXS3JBL01XUDJUa1lSRVhNaitxMFhDNE1wS1pnSWpxUkwvOUVzNmdxcEpUYjRleVlMNkZCDQorZGdyTmVMcURRNW96Z3UxemFRaTkreXVvQ0FCSUhLQ0VQdjMyVys5V3QvTWpNcUNuS2RrK1pkc3daQm5hMEZxLzE2OG9xS2gwUysrdA0KK3JwZ25kSHZXWldvak5ZK3JEcW5sNW8zVDlJdlRnVHVHOElIUFN4VU9EYldGeTF2aW0ralVlR05wQ2ZrbzZER281b0JDS3pnNUJUbHoNCisya0FFRDZGMVg2L2ErdzAvOXpHSlpKOVR5ZzZmYjhMRTdPd0RGcDFwSDk5eDZTZ1J4YStJRkhvWGhialJ6a1JpL1pSWktycW00anh2DQoraEZUWGx4OXc3MFNMMEdhd0hVd3VOT2dFVUtKTTc1QURtREVFdFJCMHBROFNSUG9Lbi9iMVJMR1FQc3ZIemNxdFNKbGpnYk1NQm1vaQ0KK0JGa0Fuem9wblZuMVJKZkJ6STZ4OVljWHROcXRKQ1RYZEh6UGc0RCtXaHdrQ0IwQUY3VzhFb1Zxdm1sUDJnMHZBZFB6NGdSOCtJNkENCitGZEdRdEM1MkNNaFgvMW1IQWVUakRDbnV2VHpadktyQUNjVkI5RWExMncxMEtMWWJzZ0FyMisydmZBZGlMVWRVWkRLSFBQdFdDK2xTDQorcnZrVEp0aXZVK1lPU3c3UENrV0Y3QklDN3BUZHA3V3V0cUdDbVZvMGVIS2ZKeFhjcGtIKys5QUxlQVE4dGZRdzlLMjBKSlcxOGZTQQ0KK3cvaHM4ZnhzNUZXamhOcFlwVXZRbHF6bk45OEsvcG5hWFFvMzczTnVmWUh5MSt5VDNzU1ZFd0JiQ2x2N3lPanJZcm15UmU2b2p3K1oNCit4WHppV2s4citWa0Zwb3R3dmdXNDF2T3V2a2hkOTRyenIxTWo3V05Fc3NUckpPUUM1VWRhMkRQWmtIZ3hCYlpjaDJydTY1Sm1pdnI0DQorOTNpVEYxNTdjNk1aaEpVU1crUDVYZCtXb0RyVXd6Y3BNeDdRZHlaYU5TUFZzTDd1RDR4T0tvcW00T2NkeXpFajRxcUR2QkxBMFRKOA0KK3NRNEZwMEE1aDduTlR1b1V2eEtNYW4wSjRyUktjN1Q0ZXN3dUxFYVRQQ0R0S3BzbWxUUytyRzRqUGFDT2xQTSsrcXJJNlZNZ0pCWk8NCitML3pHN21MdWIvSVlLbVU2U3ZlbHlrOTFYUUYyM2RoYlNxbExqZUxsR2p3dGxIaHFSdUZBU1ZJZ0lxY3hic3J4YTZDU21UckhteHIwDQorTlU1aG1FV2JsQlB2WndZWmhaTXUyYy95VGlydmtuSWlqeVRSakZtZ3dwQjczdUpIdjBvUW90QzZteVhUR05DYzBNaWhCTU9zRFFzMw0KK0Zoc2xKRlFjSDZWQTBiemUvRlNab0dpK3NNOTBseXJ1ZlFuZ2VuVjFFVnB0RkJ4NURRWVdFV1hLT2kyWlM2SlFHWVJoMVIrRVhBPT0NCisNCistLS0tLS0tLS0tLS0tLTA5MDQwNDA4MDQwNTA4MDEwODAwMDkwOS0tDQorDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3NpbXBsZS1hdHRhY2htZW50LnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9zaW1wbGUtYXR0YWNobWVudC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5YmE2OAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9zaW1wbGUtYXR0YWNobWVudC54bWwKQEAgLTAsMCArMSw2NyBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorRGF0ZTogRnJpLCAyNyBBcHIgMjAwNyAxNjowODoyMyArMDIwMDwvZmllbGQ+DQorPGZpZWxkPg0KK0Zyb206IEZvbyBCYXIgJmx0O2JhckBleGFtcGxlLmNvbSZndDs8L2ZpZWxkPg0KKzxmaWVsZD4NCitNSU1FLVZlcnNpb246IDEuMDwvZmllbGQ+DQorPGZpZWxkPg0KK1RvOiAgZm9vQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogSGVyZSBpcyB0aGUgYXR0YWNobWVudCBJIHdhcyB3YWl0aW5nIGZvci48L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsNCisgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTA5MDQwNDA4MDQwNTA4MDEwODAwMDkwOSI8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtdWx0aXBhcnQ+DQorPHByZWFtYmxlPg0KK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK0JvZHkuDQorPC9ib2R5Pg0KKzwvYm9keS1wYXJ0Pg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07DQorIG5hbWU9ImRhdGEuYmluIjwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NDwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7DQorIGZpbGVuYW1lPSJkYXRhLmJpbiI8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK2xMem15UWpCQzJndy9oaVVyY3kvRERJNUs2Q0JxRlNzNE5LQ0Y2N0c1WEJ6T25TSW5XcForOVV2OUl4RnB6OHJmODcxeEFFKw0KKyt5MFpZRVM5TFhEZFAxMnN2eHNKNGhSc2VrSDJISjk1M0tnbGIzaHhrbzdMbFBseGVEWDE1RktIMFZCRThHZ3I0UmJ3b1ArYw0KK21reXloS3lhaVY5NXljUnpSZDVvelZER2htVy9lUUlaZ3czbllKT3Q5OXZ5UHhvbGtIRDhQTGV2bXg0UFR0ZUlPNGhJV2pIRw0KK1h0S0NUTndCRzB6NGNXM0VPSFd4c3ZvNXY2SlVFdWVEYXhmRldLckEvTVdQMlRrWVJFWE1qK3EwWEM0TXBLWmdJanFSTC85RQ0KK3M2Z3FwSlRiNGV5WUw2RkJkZ3JOZUxxRFE1b3pndTF6YVFpOSt5dW9DQUJJSEtDRVB2MzJXKzlXdC9Nak1xQ25LZGsrWmRzdw0KK1pCbmEwRnEvMTY4b3FLaDBTKyt0cnBnbmRIdldaV29qTlkrckRxbmw1bzNUOUl2VGdUdUc4SUhQU3hVT0RiV0Z5MXZpbStqVQ0KK2VHTnBDZmtvNkRHbzVvQkNLemc1QlRsejJrQUVENkYxWDYvYSt3MC85ekdKWko5VHlnNmZiOExFN093REZwMXBIOTl4NlNnUg0KK3hhK0lGSG9YaGJqUnprUmkvWlJaS3JxbTRqeHZoRlRYbHg5dzcwU0wwR2F3SFV3dU5PZ0VVS0pNNzVBRG1ERUV0UkIwcFE4Uw0KK1JQb0tuL2IxUkxHUVBzdkh6Y3F0U0psamdiTU1CbW9pQkZrQW56b3BuVm4xUkpmQnpJNng5WWNYdE5xdEpDVFhkSHpQZzREKw0KK1dod2tDQjBBRjdXOEVvVnF2bWxQMmcwdkFkUHo0Z1I4K0k2QUZkR1F0QzUyQ01oWC8xbUhBZVRqRENudXZUelp2S3JBQ2NWQg0KKzlFYTEydzEwS0xZYnNnQXIyKzJ2ZkFkaUxVZFVaREtIUFB0V0MrbFNydmtUSnRpdlUrWU9TdzdQQ2tXRjdCSUM3cFRkcDdXdQ0KK3RxR0NtVm8wZUhLZkp4WGNwa0grKzlBTGVBUTh0ZlF3OUsyMEpKVzE4ZlNBdy9oczhmeHM1RldqaE5wWXBVdlFscXpuTjk4Sw0KKy9wbmFYUW8zNzNOdWZZSHkxK3lUM3NTVkV3QmJDbHY3eU9qcllybXlSZTZvancrWnhYemlXazhyK1ZrRnBvdHd2Z1c0MXZPdQ0KK3ZraGQ5NHJ6cjFNajdXTkVzc1RySk9RQzVVZGEyRFBaa0hneEJiWmNoMnJ1NjVKbWl2cjQ5M2lURjE1N2M2TVpoSlVTVytQNQ0KK1hkK1dvRHJVd3pjcE14N1FkeVphTlNQVnNMN3VENHhPS29xbTRPY2R5ekVqNHFxRHZCTEEwVEo4c1E0RnAwQTVoN25OVHVvVQ0KK3Z4S01hbjBKNHJSS2M3VDRlc3d1TEVhVFBDRHRLcHNtbFRTK3JHNGpQYUNPbFBNKytxckk2Vk1nSkJaT0wvekc3bUx1Yi9JWQ0KK0ttVTZTdmVseWs5MVhRRjIzZGhiU3FsTGplTGxHand0bEhocVJ1RkFTVklnSXFjeGJzcnhhNkNTbVRySG14cjBOVTVobUVXYg0KK2xCUHZad1laaFpNdTJjL3lUaXJ2a25JaWp5VFJqRm1nd3BCNzN1Skh2MG9Rb3RDNm15WFRHTkNjME1paEJNT3NEUXMzRmhzbA0KK0pGUWNINlZBMGJ6ZS9GU1pvR2krc005MGx5cnVmUW5nZW5WMUVWcHRGQng1RFFZV0VXWEtPaTJaUzZKUUdZUmgxUitFWEE9PTwvYm9keT4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorDQorPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3NpbXBsZS1hdHRhY2htZW50X2RlY29kZWQueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3NpbXBsZS1hdHRhY2htZW50X2RlY29kZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODQ5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvc2ltcGxlLWF0dGFjaG1lbnRfZGVjb2RlZC54bWwKQEAgLTAsMCArMSw0NiBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorRGF0ZTogRnJpLCAyNyBBcHIgMjAwNyAxNjowODoyMyArMDIwMDwvZmllbGQ+DQorPGZpZWxkPg0KK0Zyb206IEZvbyBCYXIgJmx0O2JhckBleGFtcGxlLmNvbSZndDs8L2ZpZWxkPg0KKzxmaWVsZD4NCitNSU1FLVZlcnNpb246IDEuMDwvZmllbGQ+DQorPGZpZWxkPg0KK1RvOiAgZm9vQGV4YW1wbGUuY29tPC9maWVsZD4NCis8ZmllbGQ+DQorU3ViamVjdDogSGVyZSBpcyB0aGUgYXR0YWNobWVudCBJIHdhcyB3YWl0aW5nIGZvci48L2ZpZWxkPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsNCisgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLTA5MDQwNDA4MDQwNTA4MDEwODAwMDkwOSI8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxtdWx0aXBhcnQ+DQorPHByZWFtYmxlPg0KK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0ic2ltcGxlLWF0dGFjaG1lbnRfZGVjb2RlZF8xXzEudHh0Ii8+DQorPC9ib2R5LXBhcnQ+DQorPGJvZHktcGFydD4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTsNCisgbmFtZT0iZGF0YS5iaW4iPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0PC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsNCisgZmlsZW5hbWU9ImRhdGEuYmluIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPGJpbmFyeS1ib2R5IG5hbWU9InNpbXBsZS1hdHRhY2htZW50X2RlY29kZWRfMV8yLmJpbiIvPg0KKzwvYm9keS1wYXJ0Pg0KKzxlcGlsb2d1ZT4NCisNCis8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvc2ltcGxlLWF0dGFjaG1lbnRfZGVjb2RlZF8xXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3NpbXBsZS1hdHRhY2htZW50X2RlY29kZWRfMV8xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI0YjI3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3NpbXBsZS1hdHRhY2htZW50X2RlY29kZWRfMV8xLnR4dApAQCAtMCwwICsxIEBACitCb2R5Lg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy9zaW1wbGUtYXR0YWNobWVudF9kZWNvZGVkXzFfMi5iaW4gYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvc2ltcGxlLWF0dGFjaG1lbnRfZGVjb2RlZF8xXzIuYmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWY0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvc2ltcGxlLWF0dGFjaG1lbnRfZGVjb2RlZF8xXzIuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LWxvbmctYm91bmRhcnkubXNnIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktbG9uZy1ib3VuZGFyeS5tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyYzhiYwotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LWxvbmctYm91bmRhcnkubXNnCkBAIC0wLDAgKzEsMTUgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gICINCisNCittdWx0aXBhcnQNCisNCistLTAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICANCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkNCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQorDQorVGV4dCBib2R5DQorLS0wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyANCitUaGUgYWJvdmUgbGluZSBpcyBzaW1pbGFyIHRvIHRoZSBib3VuZGFyeSBidXQgbWlzcyBhIGZpbmFsIHNwYWNlLCBzbyBpdA0KK3Nob3VsZCBiZSBwYXJ0IG9mIHRoZSBib2R5Lg0KKw0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIC0tDQorZXBpbG9ndWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvdmVyeS1sb25nLWJvdW5kYXJ5Lm91dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LWxvbmctYm91bmRhcnkub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MmM4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvdmVyeS1sb25nLWJvdW5kYXJ5Lm91dApAQCAtMCwwICsxLDE1IEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAiDQorDQorbXVsdGlwYXJ0DQorDQorLS0wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgDQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdA0KKw0KK1RleHQgYm9keQ0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gDQorVGhlIGFib3ZlIGxpbmUgaXMgc2ltaWxhciB0byB0aGUgYm91bmRhcnkgYnV0IG1pc3MgYSBmaW5hbCBzcGFjZSwgc28gaXQNCitzaG91bGQgYmUgcGFydCBvZiB0aGUgYm9keS4NCisNCistLTAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAtLQ0KK2VwaWxvZ3VlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktbG9uZy1ib3VuZGFyeS54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvdmVyeS1sb25nLWJvdW5kYXJ5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGZhOTc2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktbG9uZy1ib3VuZGFyeS54bWwKQEAgLTAsMCArMSwyNyBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorbXVsdGlwYXJ0DQorPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK1RleHQgYm9keQ0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gDQorVGhlIGFib3ZlIGxpbmUgaXMgc2ltaWxhciB0byB0aGUgYm91bmRhcnkgYnV0IG1pc3MgYSBmaW5hbCBzcGFjZSwgc28gaXQNCitzaG91bGQgYmUgcGFydCBvZiB0aGUgYm9keS4NCis8L2JvZHk+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KK2VwaWxvZ3VlPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktbG9uZy1ib3VuZGFyeV9kZWNvZGVkLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LWxvbmctYm91bmRhcnlfZGVjb2RlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlMzkxZgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LWxvbmctYm91bmRhcnlfZGVjb2RlZC54bWwKQEAgLTAsMCArMSwyMiBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorbXVsdGlwYXJ0DQorPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0idmVyeS1sb25nLWJvdW5kYXJ5X2RlY29kZWRfMV8xLnR4dCIvPg0KKzwvYm9keS1wYXJ0Pg0KKzxlcGlsb2d1ZT4NCitlcGlsb2d1ZTwvZXBpbG9ndWU+DQorPC9tdWx0aXBhcnQ+DQorPC9tZXNzYWdlPg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LWxvbmctYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktbG9uZy1ib3VuZGFyeV9kZWNvZGVkXzFfMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0YjI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LWxvbmctYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0CkBAIC0wLDAgKzEsNCBAQAorVGV4dCBib2R5DQorLS0wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyANCitUaGUgYWJvdmUgbGluZSBpcyBzaW1pbGFyIHRvIHRoZSBib3VuZGFyeSBidXQgbWlzcyBhIGZpbmFsIHNwYWNlLCBzbyBpdA0KK3Nob3VsZCBiZSBwYXJ0IG9mIHRoZSBib2R5Lg0KZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LXZlcnktbG9uZy1ib3VuZGFyeS5tc2cgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvdmVyeS12ZXJ5LWxvbmctYm91bmRhcnkubXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YmJiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvdmVyeS12ZXJ5LWxvbmctYm91bmRhcnkubXNnCkBAIC0wLDAgKzEsMTUgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gICINCisNCittdWx0aXBhcnQNCisNCistLTAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICANCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkNCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQorDQorVGV4dCBib2R5DQorLS0wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyANCitUaGUgYWJvdmUgbGluZSBpcyBzaW1pbGFyIHRvIHRoZSBib3VuZGFyeSBidXQgbWlzcyBhIGZpbmFsIHNwYWNlLCBzbyBpdA0KK3Nob3VsZCBiZSBwYXJ0IG9mIHRoZSBib2R5Lg0KKw0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIC0tDQorZXBpbG9ndWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvdmVyeS12ZXJ5LWxvbmctYm91bmRhcnkub3V0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktdmVyeS1sb25nLWJvdW5kYXJ5Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJiYmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktdmVyeS1sb25nLWJvdW5kYXJ5Lm91dApAQCAtMCwwICsxLDE1IEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAiDQorDQorbXVsdGlwYXJ0DQorDQorLS0wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgDQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdA0KKw0KK1RleHQgYm9keQ0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gDQorVGhlIGFib3ZlIGxpbmUgaXMgc2ltaWxhciB0byB0aGUgYm91bmRhcnkgYnV0IG1pc3MgYSBmaW5hbCBzcGFjZSwgc28gaXQNCitzaG91bGQgYmUgcGFydCBvZiB0aGUgYm9keS4NCisNCistLTAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAtLQ0KK2VwaWxvZ3VlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktdmVyeS1sb25nLWJvdW5kYXJ5LnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LXZlcnktbG9uZy1ib3VuZGFyeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3N2FjMgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LXZlcnktbG9uZy1ib3VuZGFyeS54bWwKQEAgLTAsMCArMSwyNyBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorbXVsdGlwYXJ0DQorPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzxib2R5Pg0KK1RleHQgYm9keQ0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gDQorVGhlIGFib3ZlIGxpbmUgaXMgc2ltaWxhciB0byB0aGUgYm91bmRhcnkgYnV0IG1pc3MgYSBmaW5hbCBzcGFjZSwgc28gaXQNCitzaG91bGQgYmUgcGFydCBvZiB0aGUgYm9keS4NCis8L2JvZHk+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KK2VwaWxvZ3VlPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktdmVyeS1sb25nLWJvdW5kYXJ5X2RlY29kZWQueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktdmVyeS1sb25nLWJvdW5kYXJ5X2RlY29kZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWI3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3MvdmVyeS12ZXJ5LWxvbmctYm91bmRhcnlfZGVjb2RlZC54bWwKQEAgLTAsMCArMSwyMiBAQAorPG1lc3NhZ2U+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgIjwvZmllbGQ+DQorPC9oZWFkZXI+DQorPG11bHRpcGFydD4NCis8cHJlYW1ibGU+DQorbXVsdGlwYXJ0DQorPC9wcmVhbWJsZT4NCis8Ym9keS1wYXJ0Pg0KKzxoZWFkZXI+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTwvZmllbGQ+DQorPGZpZWxkPg0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQ8L2ZpZWxkPg0KKzwvaGVhZGVyPg0KKzx0ZXh0LWJvZHkgbmFtZT0idmVyeS12ZXJ5LWxvbmctYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0Ii8+DQorPC9ib2R5LXBhcnQ+DQorPGVwaWxvZ3VlPg0KK2VwaWxvZ3VlPC9lcGlsb2d1ZT4NCis8L211bHRpcGFydD4NCis8L21lc3NhZ2U+DQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3ZlcnktdmVyeS1sb25nLWJvdW5kYXJ5X2RlY29kZWRfMV8xLnR4dCBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LXZlcnktbG9uZy1ib3VuZGFyeV9kZWNvZGVkXzFfMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3ZDQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy92ZXJ5LXZlcnktbG9uZy1ib3VuZGFyeV9kZWNvZGVkXzFfMS50eHQKQEAgLTAsMCArMSw0IEBACitUZXh0IGJvZHkNCistLTAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIDAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/IA0KK1RoZSBhYm92ZSBsaW5lIGlzIHNpbWlsYXIgdG8gdGhlIGJvdW5kYXJ5IGJ1dCBtaXNzIGEgZmluYWwgc3BhY2UsIHNvIGl0DQorc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGJvZHkuDQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3dlaXJkLWJvdW5kYXJ5Lm1zZyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy93ZWlyZC1ib3VuZGFyeS5tc2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkZDBjMgotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy93ZWlyZC1ib3VuZGFyeS5tc2cKQEAgLTAsMCArMSwxNSBAQAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgIg0KKw0KK211bHRpcGFydA0KKw0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIA0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQ0KK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQNCisNCitUZXh0IGJvZHkNCistLTAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/IA0KK1RoZSBhYm92ZSBsaW5lIGlzIHNpbWlsYXIgdG8gdGhlIGJvdW5kYXJ5IGJ1dCBtaXNzIGEgZmluYWwgc3BhY2UsIHNvIGl0DQorc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGJvZHkuDQorDQorLS0wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyAgLS0NCitlcGlsb2d1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy93ZWlyZC1ib3VuZGFyeS5vdXQgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvd2VpcmQtYm91bmRhcnkub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZGQwYzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvd2VpcmQtYm91bmRhcnkub3V0CkBAIC0wLDAgKzEsMTUgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gICINCisNCittdWx0aXBhcnQNCisNCistLTAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICANCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkNCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQorDQorVGV4dCBib2R5DQorLS0wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyANCitUaGUgYWJvdmUgbGluZSBpcyBzaW1pbGFyIHRvIHRoZSBib3VuZGFyeSBidXQgbWlzcyBhIGZpbmFsIHNwYWNlLCBzbyBpdA0KK3Nob3VsZCBiZSBwYXJ0IG9mIHRoZSBib2R5Lg0KKw0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gIC0tDQorZXBpbG9ndWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvd2VpcmQtYm91bmRhcnkueG1sIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3dlaXJkLWJvdW5kYXJ5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTVjYjdhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3dlaXJkLWJvdW5kYXJ5LnhtbApAQCAtMCwwICsxLDI3IEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAiPC9maWVsZD4NCis8L2hlYWRlcj4NCis8bXVsdGlwYXJ0Pg0KKzxwcmVhbWJsZT4NCittdWx0aXBhcnQNCis8L3ByZWFtYmxlPg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdDwvZmllbGQ+DQorPC9oZWFkZXI+DQorPGJvZHk+DQorVGV4dCBib2R5DQorLS0wMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZMTU5PUFJTVFVWV1hZWicoKStfLC0uLzo9PyANCitUaGUgYWJvdmUgbGluZSBpcyBzaW1pbGFyIHRvIHRoZSBib3VuZGFyeSBidXQgbWlzcyBhIGZpbmFsIHNwYWNlLCBzbyBpdA0KK3Nob3VsZCBiZSBwYXJ0IG9mIHRoZSBib2R5Lg0KKzwvYm9keT4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorZXBpbG9ndWU8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvd2VpcmQtYm91bmRhcnlfZGVjb2RlZC54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvd2VpcmQtYm91bmRhcnlfZGVjb2RlZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllYWVhMQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0bXNncy93ZWlyZC1ib3VuZGFyeV9kZWNvZGVkLnhtbApAQCAtMCwwICsxLDIyIEBACis8bWVzc2FnZT4NCis8aGVhZGVyPg0KKzxmaWVsZD4NCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkxNTk9QUlNUVVZXWFlaJygpK18sLS4vOj0/ICAiPC9maWVsZD4NCis8L2hlYWRlcj4NCis8bXVsdGlwYXJ0Pg0KKzxwcmVhbWJsZT4NCittdWx0aXBhcnQNCis8L3ByZWFtYmxlPg0KKzxib2R5LXBhcnQ+DQorPGhlYWRlcj4NCis8ZmllbGQ+DQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpPC9maWVsZD4NCis8ZmllbGQ+DQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdDwvZmllbGQ+DQorPC9oZWFkZXI+DQorPHRleHQtYm9keSBuYW1lPSJ3ZWlyZC1ib3VuZGFyeV9kZWNvZGVkXzFfMS50eHQiLz4NCis8L2JvZHktcGFydD4NCis8ZXBpbG9ndWU+DQorZXBpbG9ndWU8L2VwaWxvZ3VlPg0KKzwvbXVsdGlwYXJ0Pg0KKzwvbWVzc2FnZT4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdG1zZ3Mvd2VpcmQtYm91bmRhcnlfZGVjb2RlZF8xXzEudHh0IGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3dlaXJkLWJvdW5kYXJ5X2RlY29kZWRfMV8xLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTllNmFkCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3JjL3Rlc3QvcmVzb3VyY2VzL3Rlc3Rtc2dzL3dlaXJkLWJvdW5kYXJ5X2RlY29kZWRfMV8xLnR4dApAQCAtMCwwICsxLDQgQEAKK1RleHQgYm9keQ0KKy0tMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGTE1OT1BSU1RVVldYWVonKCkrXywtLi86PT8gDQorVGhlIGFib3ZlIGxpbmUgaXMgc2ltaWxhciB0byB0aGUgYm91bmRhcnkgYnV0IG1pc3MgYSBmaW5hbCBzcGFjZSwgc28gaXQNCitzaG91bGQgYmUgcGFydCBvZiB0aGUgYm9keS4NCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9jb21tb25zLWlvL2phcnMvY29tbW9ucy1pby0xLjIuamFyIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvY29tbW9ucy1pby9qYXJzL2NvbW1vbnMtaW8tMS4yLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg2N2NkCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvY29tbW9ucy1pby9qYXJzL2NvbW1vbnMtaW8tMS4yLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9jb21tb25zLWlvL3BvbXMvY29tbW9ucy1pby0xLjIucG9tIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvY29tbW9ucy1pby9wb21zL2NvbW1vbnMtaW8tMS4yLnBvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQ3ZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvY29tbW9ucy1pby9wb21zL2NvbW1vbnMtaW8tMS4yLnBvbQpAQCAtMCwwICsxLDIzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cHJvamVjdD4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorICA8bmFtZT5JTzwvbmFtZT4KKyAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgorICA8ZGVzY3JpcHRpb24+Q29tbW9ucy1JTyBjb250YWlucyB1dGlsaXR5IGNsYXNzZXMsIHN0cmVhbSBpbXBsZW1lbnRhdGlvbnMsIGZpbGUgZmlsdGVycywgYW5kIGVuZGlhbiBjbGFzc2VzLjwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2lvLzwvdXJsPgorICA8aXNzdWVNYW5hZ2VtZW50PgorICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhLzwvdXJsPgorICA8L2lzc3VlTWFuYWdlbWVudD4KKyAgPGNpTWFuYWdlbWVudD4KKyAgICA8bm90aWZpZXJzPgorICAgICAgPG5vdGlmaWVyPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YWRkcmVzcz5jb21tb25zLWRldkBqYWthcnRhLmFwYWNoZS5vcmc8L2FkZHJlc3M+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvbm90aWZpZXI+CisgICAgPC9ub3RpZmllcnM+CisgIDwvY2lNYW5hZ2VtZW50PgorICA8aW5jZXB0aW9uWWVhcj4yMDAyPC9pbmNlcHRpb25ZZWFyPgorICA8bWFpbGluZ0xpc3RzPgorICAgIDxtYWlsaW5nTGlzdD4KKyAgICAgIDxuYW1lPkNvbW1vbnMgRGV2IExpc3Q8L25hbWU+CisgICAgICA8c3Vic2NyaWJlPmNvbW1vbnMtZGV2LXN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KKyAgICAgIDx1bnN1YnNjcmliZT5jb21tb25zLWRldi11bnN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgorICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9leWVicm93c2UvU3VtbWFyaXplTGlzdD9saXN0TmFtZT1jb21tb25zLWRldkBqYWthcnRhLmFwYWNoZS5vcmc8L2FyY2hpdmU+CisgICAgPC9tYWlsaW5nTGlzdD4KKyAgICA8bWFpbGluZ0xpc3Q+CisgICAgICA8bmFtZT5Db21tb25zIFVzZXIgTGlzdDwvbmFtZT4KKyAgICAgIDxzdWJzY3JpYmU+Y29tbW9ucy11c2VyLXN1YnNjcmliZUBqYWthcnRhLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KKyAgICAgIDx1bnN1YnNjcmliZT5jb21tb25zLXVzZXItdW5zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KKyAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvZXllYnJvd3NlL1N1bW1hcml6ZUxpc3Q/bGlzdE5hbWU9Y29tbW9ucy11c2VyQGpha2FydGEuYXBhY2hlLm9yZzwvYXJjaGl2ZT4KKyAgICA8L21haWxpbmdMaXN0PgorICA8L21haWxpbmdMaXN0cz4KKyAgPGRldmVsb3BlcnM+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5zYW5kZXJzPC9pZD4KKyAgICAgIDxuYW1lPlNjb3R0IFNhbmRlcnM8L25hbWU+CisgICAgICA8ZW1haWw+c2FuZGVyc0BhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPgorICAgICAgPC9yb2xlcz4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmRpb248L2lkPgorICAgICAgPG5hbWU+ZElvbiBHaWxsYXJkPC9uYW1lPgorICAgICAgPGVtYWlsPmRpb25AYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgorICAgICAgPHJvbGVzPgorICAgICAgICA8cm9sZT5KYXZhIERldmVsb3Blcjwvcm9sZT4KKyAgICAgIDwvcm9sZXM+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5uaWNvbGFrZW48L2lkPgorICAgICAgPG5hbWU+Tmljb2xhIEtlbiBCYXJvenppPC9uYW1lPgorICAgICAgPGVtYWlsPm5pY29sYWtlbkBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPgorICAgICAgPC9yb2xlcz4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJheWFyZDwvaWQ+CisgICAgICA8bmFtZT5IZW5yaSBZYW5kZWxsPC9uYW1lPgorICAgICAgPGVtYWlsPmJheWFyZEBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPgorICAgICAgPC9yb2xlcz4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPnNjb2xlYm91cm5lPC9pZD4KKyAgICAgIDxuYW1lPlN0ZXBoZW4gQ29sZWJvdXJuZTwvbmFtZT4KKyAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPgorICAgICAgPC9yb2xlcz4KKyAgICAgIDx0aW1lem9uZT4wPC90aW1lem9uZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmplcmVtaWFzPC9pZD4KKyAgICAgIDxuYW1lPkplcmVtaWFzIE1hZXJraTwvbmFtZT4KKyAgICAgIDxlbWFpbD5qZXJlbWlhc0BhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPgorICAgICAgPC9yb2xlcz4KKyAgICAgIDx0aW1lem9uZT4rMTwvdGltZXpvbmU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5tYXR0aDwvaWQ+CisgICAgICA8bmFtZT5NYXR0aGV3IEhhd3Rob3JuZTwvbmFtZT4KKyAgICAgIDxlbWFpbD5tYXR0aEBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPgorICAgICAgPC9yb2xlcz4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPm1hcnRpbmM8L2lkPgorICAgICAgPG5hbWU+TWFydGluIENvb3BlcjwvbmFtZT4KKyAgICAgIDxlbWFpbD5tYXJ0aW5jQGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgPG9yZ2FuaXphdGlvbj48L29yZ2FuaXphdGlvbj4KKyAgICAgIDxyb2xlcz4KKyAgICAgICAgPHJvbGU+SmF2YSBEZXZlbG9wZXI8L3JvbGU+CisgICAgICA8L3JvbGVzPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+cm94c3ByaW5nPC9pZD4KKyAgICAgIDxuYW1lPlJvYiBPeHNwcmluZzwvbmFtZT4KKyAgICAgIDxlbWFpbD5yb3hzcHJpbmdAYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICA8b3JnYW5pemF0aW9uPjwvb3JnYW5pemF0aW9uPgorICAgICAgPHJvbGVzPgorICAgICAgICA8cm9sZT5KYXZhIERldmVsb3Blcjwvcm9sZT4KKyAgICAgIDwvcm9sZXM+CisgICAgPC9kZXZlbG9wZXI+CisgIDwvZGV2ZWxvcGVycz4KKyAgPGNvbnRyaWJ1dG9ycz4KKyAgICA8Y29udHJpYnV0b3I+CisgICAgICA8bmFtZT5SYWh1bCBBa29sa2FyPC9uYW1lPgorICAgIDwvY29udHJpYnV0b3I+CisgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgPG5hbWU+SmFzb24gQW5kZXJzb248L25hbWU+CisgICAgPC9jb250cmlidXRvcj4KKyAgICA8Y29udHJpYnV0b3I+CisgICAgICA8bmFtZT5OYXRoYW4gQmV5ZXI8L25hbWU+CisgICAgPC9jb250cmlidXRvcj4KKyAgICA8Y29udHJpYnV0b3I+CisgICAgICA8bmFtZT5DaHJpcyBFbGRyZWRnZTwvbmFtZT4KKyAgICA8L2NvbnRyaWJ1dG9yPgorICAgIDxjb250cmlidXRvcj4KKyAgICAgIDxuYW1lPkppbSBIYXJyaW5ndG9uPC9uYW1lPgorICAgIDwvY29udHJpYnV0b3I+CisgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgPG5hbWU+VGhvbWFzIExlZG91eDwvbmFtZT4KKyAgICA8L2NvbnRyaWJ1dG9yPgorICAgIDxjb250cmlidXRvcj4KKyAgICAgIDxuYW1lPkFuZHkgTGVoYW5lPC9uYW1lPgorICAgIDwvY29udHJpYnV0b3I+CisgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgPG5hbWU+TWFyY2VsbyBMaWJlcmF0bzwvbmFtZT4KKyAgICA8L2NvbnRyaWJ1dG9yPgorICAgIDxjb250cmlidXRvcj4KKyAgICAgIDxuYW1lPkFsYmFuIFBlaWduaWVyPC9uYW1lPgorICAgICAgPGVtYWlsPmFsYmFuLnBlaWduaWVyIGF0IGZyZWUuZnI8L2VtYWlsPgorICAgIDwvY29udHJpYnV0b3I+CisgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgPG5hbWU+TmlhbGwgUGVtYmVydG9uPC9uYW1lPgorICAgIDwvY29udHJpYnV0b3I+CisgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgPG5hbWU+SWFuIFNwcmluZ2VyPC9uYW1lPgorICAgIDwvY29udHJpYnV0b3I+CisgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgPG5hbWU+TWFzYXRvIFRlenVrYTwvbmFtZT4KKyAgICA8L2NvbnRyaWJ1dG9yPgorICAgIDxjb250cmlidXRvcj4KKyAgICAgIDxuYW1lPkZyYW5rIFcuIFphbW1ldHRpPC9uYW1lPgorICAgIDwvY29udHJpYnV0b3I+CisgIDwvY29udHJpYnV0b3JzPgorICA8bGljZW5zZXM+CisgICAgPGxpY2Vuc2U+CisgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgPHVybD4vTElDRU5TRS50eHQ8L3VybD4KKyAgICA8L2xpY2Vuc2U+CisgIDwvbGljZW5zZXM+CisgIDxzY20+CisgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2pha2FydGEvY29tbW9ucy9wcm9wZXIvaW8vdHJ1bms8L2Nvbm5lY3Rpb24+CisgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2pha2FydGEvY29tbW9ucy9wcm9wZXIvaW8vdHJ1bms8L3VybD4KKyAgPC9zY20+CisgIDxvcmdhbml6YXRpb24+CisgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZzwvdXJsPgorICA8L29yZ2FuaXphdGlvbj4KKyAgPGJ1aWxkPgorICAgIDxzb3VyY2VEaXJlY3Rvcnk+c3JjL2phdmE8L3NvdXJjZURpcmVjdG9yeT4KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT5zcmMvdGVzdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGRpcmVjdG9yeT4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0UudHh0PC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgPGluY2x1ZGU+KiovKlRlc3QqPC9pbmNsdWRlPgorICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKkFic3RyYWN0VGVzdENhc2UqPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQWxsSU9UZXN0U3VpdGUqPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+KiovUGFja2FnZVRlc3RTdWl0ZSo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT4qKi90ZXN0dG9vbHMvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5tYXZlbi1wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb2JlcnR1cmEtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgIDxjb21tZW50PlJlcXVpcmVkIG9ubHkgZm9yIGdlbmVyYXRpbmcgdGVzdCBjb3ZlcmFnZSByZXBvcnRzLjwvY29tbWVudD4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmRlZmF1bHQ8L2lkPgorICAgICAgPG5hbWU+RGVmYXVsdCBSZXBvc2l0b3J5PC9uYW1lPgorICAgICAgPHVybD5maWxlOi8vL3d3dy9qYWthcnRhLmFwYWNoZS5vcmcvYnVpbGRzL2pha2FydGEtY29tbW9ucy9pby88L3VybD4KKyAgICA8L3JlcG9zaXRvcnk+CisgICAgPHNpdGU+CisgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+CisgICAgICA8bmFtZT5EZWZhdWx0IFNpdGU8L25hbWU+CisgICAgICA8dXJsPnNjcDovL3Blb3BsZS5hcGFjaGUub3JnLy93d3cvamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvaW8vPC91cmw+CisgICAgPC9zaXRlPgorICAgIDxzdGF0dXM+Y29udmVydGVkPC9zdGF0dXM+CisgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4xLmphciBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL2NvbW1vbnMtbG9nZ2luZy9qYXJzL2NvbW1vbnMtbG9nZ2luZy0xLjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjliYmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9jb21tb25zLWxvZ2dpbmcvamFycy9jb21tb25zLWxvZ2dpbmctMS4xLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9jb21tb25zLWxvZ2dpbmcvcG9tcy9jb21tb25zLWxvZ2dpbmctMS4xLnBvbSBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL2NvbW1vbnMtbG9nZ2luZy9wb21zL2NvbW1vbnMtbG9nZ2luZy0xLjEucG9tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWExNmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9jb21tb25zLWxvZ2dpbmcvcG9tcy9jb21tb25zLWxvZ2dpbmctMS4xLnBvbQpAQCAtMCwwICsxLDE5MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cHJvamVjdD4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgPG5hbWU+TG9nZ2luZzwvbmFtZT4KKyAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgorICA8ZGVzY3JpcHRpb24+Q29tbW9ucyBMb2dnaW5nIGlzIGEgdGhpbiBhZGFwdGVyIGFsbG93aW5nIGNvbmZpZ3VyYWJsZSBicmlkZ2luZyB0byBvdGhlciwKKyAgICB3ZWxsIGtub3duIGxvZ2dpbmcgc3lzdGVtcy48L2Rlc2NyaXB0aW9uPgorICA8dXJsPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy8ke3BvbS5hcnRpZmFjdElkLnN1YnN0cmluZyg4KX0vPC91cmw+CisgIDxpc3N1ZU1hbmFnZW1lbnQ+CisgICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvPC91cmw+CisgIDwvaXNzdWVNYW5hZ2VtZW50PgorICA8Y2lNYW5hZ2VtZW50PgorICAgIDxub3RpZmllcnM+CisgICAgICA8bm90aWZpZXI+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhZGRyZXNzPmNvbW1vbnMtZGV2QGpha2FydGEuYXBhY2hlLm9yZzwvYWRkcmVzcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9ub3RpZmllcj4KKyAgICA8L25vdGlmaWVycz4KKyAgPC9jaU1hbmFnZW1lbnQ+CisgIDxpbmNlcHRpb25ZZWFyPjIwMDE8L2luY2VwdGlvblllYXI+CisgIDxtYWlsaW5nTGlzdHM+CisgICAgPG1haWxpbmdMaXN0PgorICAgICAgPG5hbWU+Q29tbW9ucyBEZXYgTGlzdDwvbmFtZT4KKyAgICAgIDxzdWJzY3JpYmU+Y29tbW9ucy1kZXYtc3Vic2NyaWJlQGpha2FydGEuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgorICAgICAgPHVuc3Vic2NyaWJlPmNvbW1vbnMtZGV2LXVuc3Vic2NyaWJlQGpha2FydGEuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+CisgICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2pha2FydGEtY29tbW9ucy1kZXYvPC9hcmNoaXZlPgorICAgIDwvbWFpbGluZ0xpc3Q+CisgICAgPG1haWxpbmdMaXN0PgorICAgICAgPG5hbWU+Q29tbW9ucyBVc2VyIExpc3Q8L25hbWU+CisgICAgICA8c3Vic2NyaWJlPmNvbW1vbnMtdXNlci1zdWJzY3JpYmVAamFrYXJ0YS5hcGFjaGUub3JnPC9zdWJzY3JpYmU+CisgICAgICA8dW5zdWJzY3JpYmU+Y29tbW9ucy11c2VyLXVuc3Vic2NyaWJlQGpha2FydGEuYXBhY2hlLm9yZzwvdW5zdWJzY3JpYmU+CisgICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2pha2FydGEtY29tbW9ucy11c2VyLzwvYXJjaGl2ZT4KKyAgICA8L21haWxpbmdMaXN0PgorICA8L21haWxpbmdMaXN0cz4KKyAgPGRldmVsb3BlcnM+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5tb3JnYW5kPC9pZD4KKyAgICAgIDxuYW1lPk1vcmdhbiBEZWxhZ3JhbmdlPC9uYW1lPgorICAgICAgPGVtYWlsPm1vcmdhbmQgYXQgYXBhY2hlIGRvdCBvcmc8L2VtYWlsPgorICAgICAgPG9yZ2FuaXphdGlvbj5BcGFjaGU8L29yZ2FuaXphdGlvbj4KKyAgICAgIDxyb2xlcz4KKyAgICAgICAgPHJvbGU+SmF2YSBEZXZlbG9wZXI8L3JvbGU+CisgICAgICA8L3JvbGVzPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+cndhbGRob2ZmPC9pZD4KKyAgICAgIDxuYW1lPlJvZG5leSBXYWxkaG9mZjwvbmFtZT4KKyAgICAgIDxlbWFpbD5yd2FsZGhvZmYgYXQgYXBhY2hlIG9yZzwvZW1haWw+CisgICAgICA8b3JnYW5pemF0aW9uPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vcmdhbml6YXRpb24+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5jcmFpZ21jYzwvaWQ+CisgICAgICA8bmFtZT5DcmFpZyBNY0NsYW5haGFuPC9uYW1lPgorICAgICAgPGVtYWlsPmNyYWlnbWNjIGF0IGFwYWNoZSBvcmc8L2VtYWlsPgorICAgICAgPG9yZ2FuaXphdGlvbj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+c2FuZGVyczwvaWQ+CisgICAgICA8bmFtZT5TY290dCBTYW5kZXJzPC9uYW1lPgorICAgICAgPGVtYWlsPnNhbmRlcnMgYXQgYXBhY2hlIGRvdCBvcmc8L2VtYWlsPgorICAgICAgPG9yZ2FuaXphdGlvbj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+cmRvbmtpbjwvaWQ+CisgICAgICA8bmFtZT5Sb2JlcnQgQnVycmVsbCBEb25raW48L25hbWU+CisgICAgICA8ZW1haWw+cmRvbmtpbiBhdCBhcGFjaGUgZG90IG9yZzwvZW1haWw+CisgICAgICA8b3JnYW5pemF0aW9uPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vcmdhbml6YXRpb24+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5kb25hbGRwPC9pZD4KKyAgICAgIDxuYW1lPlBldGVyIERvbmFsZDwvbmFtZT4KKyAgICAgIDxlbWFpbD5kb25hbGRwIGF0IGFwYWNoZSBkb3Qgb3JnPC9lbWFpbD4KKyAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5jb3N0aW48L2lkPgorICAgICAgPG5hbWU+Q29zdGluIE1hbm9sYWNoZTwvbmFtZT4KKyAgICAgIDxlbWFpbD5jb3N0aW4gYXQgYXBhY2hlIGRvdCBvcmc8L2VtYWlsPgorICAgICAgPG9yZ2FuaXphdGlvbj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+cnNpdHplPC9pZD4KKyAgICAgIDxuYW1lPlJpY2hhcmQgU2l0emU8L25hbWU+CisgICAgICA8ZW1haWw+cnNpdHplIGF0IGFwYWNoZSBkb3Qgb3JnPC9lbWFpbD4KKyAgICAgIDxvcmdhbml6YXRpb24+QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L29yZ2FuaXphdGlvbj4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJhbGl1a2E8L2lkPgorICAgICAgPG5hbWU+SnVvemFzIEJhbGl1a2E8L25hbWU+CisgICAgICA8ZW1haWw+YmFsaXVrYUBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDxvcmdhbml6YXRpb24+PC9vcmdhbml6YXRpb24+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkphdmEgRGV2ZWxvcGVyPC9yb2xlPgorICAgICAgPC9yb2xlcz4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPnNraXRjaGluZzwvaWQ+CisgICAgICA8bmFtZT5TaW1vbiBLaXRjaGluZzwvbmFtZT4KKyAgICAgIDxlbWFpbD5za2l0Y2hpbmdAYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICA8b3JnYW5pemF0aW9uPkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9vcmdhbml6YXRpb24+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5kZW5uaXNsPC9pZD4KKyAgICAgIDxuYW1lPkRlbm5pcyBMdW5kYmVyZzwvbmFtZT4KKyAgICAgIDxlbWFpbD5kZW5uaXNsQGFwYWNoZS5vcmc8L2VtYWlsPgorICAgICAgPG9yZ2FuaXphdGlvbj5BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvb3JnYW5pemF0aW9uPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+YnN0YW5zYmVycnk8L2lkPgorICAgICAgPG5hbWU+QnJpYW4gU3RhbnNiZXJyeTwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgPC9kZXZlbG9wZXJzPgorICA8bGljZW5zZXM+CisgICAgPGxpY2Vuc2U+CisgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgPHVybD4vTElDRU5TRS50eHQ8L3VybD4KKyAgICA8L2xpY2Vuc2U+CisgIDwvbGljZW5zZXM+CisgIDxzY20+CisgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2pha2FydGEvY29tbW9ucy9wcm9wZXIvJHtwb20uYXJ0aWZhY3RJZC5zdWJzdHJpbmcoOCl9L3RydW5rPC9jb25uZWN0aW9uPgorICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9qYWthcnRhL2NvbW1vbnMvcHJvcGVyLyR7cG9tLmFydGlmYWN0SWQuc3Vic3RyaW5nKDgpfS90cnVuazwvdXJsPgorICA8L3NjbT4KKyAgPG9yZ2FuaXphdGlvbj4KKyAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgPHVybD5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnPC91cmw+CisgIDwvb3JnYW5pemF0aW9uPgorICA8YnVpbGQ+CisgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvamF2YTwvc291cmNlRGlyZWN0b3J5PgorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5PnNyYy90ZXN0PC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDxwbHVnaW5zPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT4qKi9BdmFsb25Mb2dnZXJUZXN0LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi14ZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS45LjI8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxjb21tZW50PiZsdDtzdHJvbmc+U2l0ZSBPbmx5Jmx0Oy9zdHJvbmc+IC0gdjEuOS4yIChtaW5pbXVtKTwvY29tbWVudD4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sb2c0ajwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMi4xMjwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5sb2draXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sb2draXQ8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+YXZhbG9uLWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmF2YWxvbi1mcmFtZXdvcms8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj40LjEuMzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKyAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+CisgICAgICA8bmFtZT5EZWZhdWx0IFJlcG9zaXRvcnk8L25hbWU+CisgICAgICA8dXJsPmZpbGU6Ly8vd3d3L2pha2FydGEuYXBhY2hlLm9yZy9idWlsZHMvamFrYXJ0YS1jb21tb25zLyR7cG9tLmFydGlmYWN0SWQuc3Vic3RyaW5nKDgpfS88L3VybD4KKyAgICA8L3JlcG9zaXRvcnk+CisgICAgPHNpdGU+CisgICAgICA8aWQ+ZGVmYXVsdDwvaWQ+CisgICAgICA8bmFtZT5EZWZhdWx0IFNpdGU8L25hbWU+CisgICAgICA8dXJsPnNjcDovL2N2cy5hcGFjaGUub3JnLy93d3cvamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvJHtwb20uYXJ0aWZhY3RJZC5zdWJzdHJpbmcoOCl9LzwvdXJsPgorICAgIDwvc2l0ZT4KKyAgICA8c3RhdHVzPmNvbnZlcnRlZDwvc3RhdHVzPgorICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9qdW5pdC9qYXJzL2p1bml0LTMuOC4xLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzRkNzFlCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvanVuaXQvamFycy9qdW5pdC0zLjguMS5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvanVuaXQvcG9tcy9qdW5pdC0zLjguMS5wb20gYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9qdW5pdC9wb21zL2p1bml0LTMuOC4xLnBvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzI0NjQyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvanVuaXQvcG9tcy9qdW5pdC0zLjguMS5wb20KQEAgLTAsMCArMSwzMyBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDwhLS0KKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgIC0tPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQorICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgIDxuYW1lPkpVbml0PC9uYW1lPg0KKyAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+DQorICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KKyAgPHVybD5odHRwOi8vd3d3Lmp1bml0Lm9yZzwvdXJsPg0KKyAgPGxpY2Vuc2VzPgorICAgIDxsaWNlbnNlPgorICAgICAgPG5hbWU+Q1BMIHYxLjA8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly9qdW5pdC5zb3VyY2Vmb3JnZS5uZXQvY3BsLXYxMC5odG1sPC91cmw+CisgICAgPC9saWNlbnNlPgorICA8L2xpY2Vuc2VzPgorPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL2xvZzRqL2phcnMvbG9nNGotMS4yLjE0LmphciBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL2xvZzRqL2phcnMvbG9nNGotMS4yLjE0LmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjUxMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvbG9nNGovamFycy9sb2c0ai0xLjIuMTQuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL2xvZzRqL3BvbXMvbG9nNGotMS4yLjE0LnBvbSBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL2xvZzRqL3BvbXMvbG9nNGotMS4yLjE0LnBvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM5NjIyCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2UvbG9nNGovcG9tcy9sb2c0ai0xLjIuMTQucG9tCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMvamFycy9tYXZlbi1za2luLTEuMS5qYXIgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9vcmcuYXBhY2hlLmphbWVzL2phcnMvbWF2ZW4tc2tpbi0xLjEuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZDI3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9vcmcuYXBhY2hlLmphbWVzL2phcnMvbWF2ZW4tc2tpbi0xLjEuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMvcG9tcy9qYW1lcy1wYXJlbnQtMS4xLnBvbSBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMvcG9tcy9qYW1lcy1wYXJlbnQtMS4xLnBvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGI4ZGVhCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy9wb21zL2phbWVzLXBhcmVudC0xLjEucG9tCkBAIC0wLDAgKzEsMzg1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDwhLS0KKyAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAgICB1bmRlciB0aGUgTGljZW5zZS4gICAgCisgIC0tPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmphbWVzLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgPG5hbWU+QXBhY2hlIEpBTUVTIFBhcmVudCBQT008L25hbWU+CisgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgPGRlc2NyaXB0aW9uPgorICAgIFRoZSBBcGFjaGUgSkFNRVMgUGFyZW50IFBPTQorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxwcmVyZXF1aXNpdGVzPgorICAgIDxtYXZlbj4yLjAuNjwvbWF2ZW4+CisgIDwvcHJlcmVxdWlzaXRlcz4KKyAgCisgIDxtb2R1bGVzPgorICAgIDxtb2R1bGU+bWF2ZW4tc2tpbjwvbW9kdWxlPgorICAgIDxtb2R1bGU+cHJvamVjdDwvbW9kdWxlPgorICA8L21vZHVsZXM+CisKKyAgPHVybD5odHRwOi8vamFtZXMuYXBhY2hlLm9yZy88L3VybD4KKyAgPGluY2VwdGlvblllYXI+MjAwNjwvaW5jZXB0aW9uWWVhcj4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8ZGVwZW5kZW5jaWVzPgorICA8L2RlcGVuZGVuY2llcz4KKworICA8b3JnYW5pemF0aW9uPgorICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KKyAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZzwvdXJsPgorICA8L29yZ2FuaXphdGlvbj4KKworICA8bGljZW5zZXM+CisgICAgPGxpY2Vuc2U+CisgICAgICA8bmFtZT5BcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjA8L25hbWU+CisgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC91cmw+CisgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICA8L2xpY2Vuc2U+CisgIDwvbGljZW5zZXM+CisKKyAgPGlzc3VlTWFuYWdlbWVudD4KKyAgICA8c3lzdGVtPkpJUkE8L3N5c3RlbT4KKyAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9KQU1FUzwvdXJsPgorICA8L2lzc3VlTWFuYWdlbWVudD4KKworICA8ZGV2ZWxvcGVycz4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJhZ288L2lkPgorICAgICAgPG5hbWU+U3RlZmFubyBCYWduYXJhPC9uYW1lPgorICAgICAgPGVtYWlsPmJhZ28gYXQgYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICA8dGltZXpvbmU+MjwvdGltZXpvbmU+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KKyAgICAgIDwvcm9sZXM+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5ub3JtYW48L2lkPgorICAgICAgPG5hbWU+Tm9ybWFuIE1hdXJlcjwvbmFtZT4KKyAgICAgIDxlbWFpbD5ub3JtYW4gYXQgYXBhY2hlLm9yZzwvZW1haWw+CisgICAgICA8dGltZXpvbmU+MjwvdGltZXpvbmU+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KKyAgICAgIDwvcm9sZXM+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5zZXJnZTwvaWQ+CisgICAgICA8bmFtZT5TZXJnZSBLbnlzdGF1dGFzPC9uYW1lPgorICAgICAgPGVtYWlsPnNlcmdlayBhdCBsb2tpdGVjaC5jb208L2VtYWlsPgorICAgICAgPHRpbWV6b25lIC8+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KKyAgICAgIDwvcm9sZXM+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5iZW5yZGY8L2lkPgorICAgICAgPG5hbWU+QmVybmQgRm9uZGVybWFubjwvbmFtZT4KKyAgICAgIDxlbWFpbD5iZl9qYWsgYXQgYnJhaW5sb3VuZ2UuZGU8L2VtYWlsPgorICAgICAgPHRpbWV6b25lIC8+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KKyAgICAgIDwvcm9sZXM+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5zYnJld2luPC9pZD4KKyAgICAgIDxuYW1lPlN0ZXZlIEJyZXdpbjwvbmFtZT4KKyAgICAgIDxlbWFpbD5zYnJld2luIGF0IHN5bnN5cy5jb208L2VtYWlsPgorICAgICAgPHRpbWV6b25lIC8+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KKyAgICAgIDwvcm9sZXM+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5oaWxtZXI8L2lkPgorICAgICAgPCEtLSBUaGlzIGlzIG5vdCBjb3JyZWN0bHkgaGFuZGxlZCBieSBtYXZlbiByZWxlYXNlIHBsdWdpbiAtLT4KKyAgICAgIDwhLS0gPG5hbWU+UyYjMjQ4O3JlbiBIaWxtZXI8L25hbWU+IC0tPgorICAgICAgPG5hbWU+U29yZW4gSGlsbWVyPC9uYW1lPgorICAgICAgPGVtYWlsPnNoIGF0IHdpZGV0cmFpbC5kazwvZW1haWw+CisgICAgICA8dGltZXpvbmUgLz4KKyAgICAgIDxyb2xlcz4KKyAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgorICAgICAgPC9yb2xlcz4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPm5vZWw8L2lkPgorICAgICAgPG5hbWU+Tm9lbCBKLiBCZXJnbWFuPC9uYW1lPgorICAgICAgPGVtYWlsPm5vZWwgYXQgZGV2dGVjaC5jb208L2VtYWlsPgorICAgICAgPHRpbWV6b25lIC8+CisgICAgICA8cm9sZXM+CisgICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KKyAgICAgIDwvcm9sZXM+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5kYW5ueTwvaWQ+CisgICAgICA8bmFtZT5EYW5ueSBBbmd1czwvbmFtZT4KKyAgICAgIDxlbWFpbD5kYW5ueSBhdCBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDx0aW1lem9uZSAvPgorICAgICAgPHJvbGVzPgorICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICA8L3JvbGVzPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+YWRjPC9pZD4KKyAgICAgIDxuYW1lPkFsYW4gRC4gQ2FicmVyYTwvbmFtZT4KKyAgICAgIDxlbWFpbD5saXN0IGF0IHRvb2xhenlkb2dzLmNvbTwvZW1haWw+CisgICAgICA8dGltZXpvbmU+LTg8L3RpbWV6b25lPgorICAgICAgPHJvbGVzPgorICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICA8L3JvbGVzPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+dmluY2Vuem88L2lkPgorICAgICAgPG5hbWU+VmluY2Vuem8gR2lhbmZlcnJhcmkgUGluaTwvbmFtZT4KKyAgICAgIDxlbWFpbD52aW5jZW56by5naWFuZmVycmFyaXBpbmkgYXQgcHJheGlzLml0PC9lbWFpbD4KKyAgICAgIDx0aW1lem9uZSAvPgorICAgICAgPHJvbGVzPgorICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICA8L3JvbGVzPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+cmRvbmtpbjwvaWQ+CisgICAgICA8bmFtZT5Sb2JlcnQgQnVycmVsbCBEb25raW48L25hbWU+CisgICAgICA8ZW1haWw+cmRvbmtpbiBhdCBhcGFjaGUub3JnPC9lbWFpbD4KKyAgICAgIDx0aW1lem9uZSAvPgorICAgICAgPHJvbGVzPgorICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+CisgICAgICA8L3JvbGVzPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+bmlrbGFzPC9pZD4KKyAgICAgIDxuYW1lPk5pa2xhcyBUaGVybmluZzwvbmFtZT4KKyAgICAgIDxlbWFpbD5uaWtsYXMoYXQpYXBhY2hlKGRvdClvcmc8L2VtYWlsPgorICAgICAgPG9yZ2FuaXphdGlvbj5UcmlsbGlhbiBBQjwvb3JnYW5pemF0aW9uPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+amNoZW5nPC9pZD4KKyAgICAgIDxuYW1lPkpvZSBDaGVuZzwvbmFtZT4KKyAgICAgIDxlbWFpbD5qb2UoYXQpam9lY2hlbmcoZG90KWNvbTwvZW1haWw+CisgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIEZvcm1lciBhdXRob3IgdG8gdGhlIG1pbWU0aiBwcm9kdWN0CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L3Byb3BlcnRpZXM+CisgICAgPC9kZXZlbG9wZXI+CisgIDwvZGV2ZWxvcGVycz4KKworICA8Y29udHJpYnV0b3JzPgorICAgIDxjb250cmlidXRvcj4KKyAgICAgIDxuYW1lPlJvYiBPeHNwcmluZzwvbmFtZT4KKyAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgICAgQ29udHJpYnV0ZWQgdG8gdGhlIG1pbWU0aiBwcm9kdWN0CisgICAgICAgIDwvZGVzY3JpcHRpb24+CisgICAgICA8L3Byb3BlcnRpZXM+CisgICAgPC9jb250cmlidXRvcj4KKyAgICA8Y29udHJpYnV0b3I+CisgICAgICA8bmFtZT5Sb2dlciBGdWxsZXJ0b248L25hbWU+CisgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAgIFdyb3RlIHNwZmphdmEsIHRoZSBmaXJzdCBzcGYgaW1wbGVtZW50YXRpb24gaW4gamF2YQorICAgICAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgPC9wcm9wZXJ0aWVzPgorICAgIDwvY29udHJpYnV0b3I+CisgIDwvY29udHJpYnV0b3JzPgorCisgIDxzY20+CisgICAgPGNvbm5lY3Rpb24+c2NtOnN2bjpodHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2phbWVzL3Byb2plY3QvdGFncy9qYW1lcy1wYXJlbnQtMS4xPC9jb25uZWN0aW9uPgorICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvamFtZXMvcHJvamVjdC90YWdzL2phbWVzLXBhcmVudC0xLjE8L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL2phbWVzL3Byb2plY3QvdGFncy9qYW1lcy1wYXJlbnQtMS4xPC91cmw+CisgIDwvc2NtPgorCisgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmFwYWNoZS5yZWxlYXNlczwvaWQ+CisgICAgICA8bmFtZT5BcGFjaGUgUmVsZWFzZSBEaXN0cmlidXRpb24gUmVwb3NpdG9yeTwvbmFtZT4KKyAgICAgIDx1cmw+c2NwOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItaWJpYmxpby1yc3luYy1yZXBvc2l0b3J5PC91cmw+CisgICAgPC9yZXBvc2l0b3J5PgorICAgIDxzbmFwc2hvdFJlcG9zaXRvcnk+CisgICAgICA8aWQ+YXBhY2hlLnNuYXBzaG90czwvaWQ+CisgICAgICA8bmFtZT5BcGFjaGUgRGV2ZWxvcG1lbnQgU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KKyAgICAgIDx1cmw+c2NwOi8vcGVvcGxlLmFwYWNoZS5vcmcvd3d3L3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgorICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgorICAgIDwhLS0gRWFjaCBwcm9qZWN0IG11c3Qgb3ZlcnJpZGUgdGhpcyB3aXRoIHRoZWlyIG93biAtLT4KKyAgICA8c2l0ZT4KKyAgICAgIDxpZD5qYW1lcy1wYXJlbnQtd2Vic2l0ZTwvaWQ+CisgICAgICA8dXJsPnNjcDovL21pbm90YXVyLmFwYWNoZS5vcmcvd3d3L2phbWVzLmFwYWNoZS5vcmcvcGFyZW50LzwvdXJsPgorICAgIDwvc2l0ZT4KKyAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorCisgIDxyZXBvc2l0b3JpZXM+CisgICAgPHJlcG9zaXRvcnk+CisgICAgICA8aWQ+Y2VudHJhbDwvaWQ+CisgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yPC91cmw+CisgICAgICA8cmVsZWFzZXM+CisgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgorICAgICAgPC9yZWxlYXNlcz4KKyAgICAgIDxzbmFwc2hvdHM+CisgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgorICAgICAgPC9zbmFwc2hvdHM+CisgICAgPC9yZXBvc2l0b3J5PgorICAgIDxyZXBvc2l0b3J5PgorICAgICAgPGlkPmFwYWNoZS5yZWxlYXNlczwvaWQ+CisgICAgICA8bmFtZT5BcGFjaGUgTWFpbiBNMiBSZXBvc2l0b3J5PC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1pYmlibGlvLXJzeW5jLXJlcG9zaXRvcnk8L3VybD4KKyAgICAgIDxyZWxlYXNlcz4KKyAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KKyAgICAgIDwvcmVsZWFzZXM+CisgICAgICA8c25hcHNob3RzPgorICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KKyAgICAgIDwvc25hcHNob3RzPgorICAgIDwvcmVwb3NpdG9yeT4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KKyAgICAgIDxuYW1lPkFwYWNoZSBTbmFwc2hvdCBSZXBvc2l0b3J5PC9uYW1lPgorICAgICAgPHVybD5odHRwOi8vcGVvcGxlLmFwYWNoZS5vcmcvcmVwby9tMi1zbmFwc2hvdC1yZXBvc2l0b3J5PC91cmw+CisgICAgICA8cmVsZWFzZXM+CisgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgorICAgICAgPC9yZWxlYXNlcz4KKyAgICAgIDxzbmFwc2hvdHM+CisgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+CisgICAgICA8L3NuYXBzaG90cz4KKyAgICA8L3JlcG9zaXRvcnk+CisgIDwvcmVwb3NpdG9yaWVzPgorICAKKyAgPHByb2ZpbGVzPgorICAgIDwhLS0gcGFyZW50IHByb2ZpbGU6IHVzZWQgdG8gZmluZCBza2luIGRlcGVuZGVuY3kgaW4gc3RhZ2UgLS0+CisgICAgPHByb2ZpbGU+CisgICAgICA8aWQ+cGFyZW50PC9pZD4KKyAgICAgIDxyZXBvc2l0b3JpZXM+CisgICAgICAgIDxyZXBvc2l0b3J5PgorICAgICAgICAgIDxpZD5sb2NhbC1qYW1lcy1wYXJlbnQtc3RhZ2U8L2lkPgorICAgICAgICAgIDxuYW1lPkFwYWNoZSBKQU1FUyBwYXJlbnQgc3RhZ2UgcmVwb3NpdG9yeSBmb2xkZXI8L25hbWU+CisgICAgICAgICAgPHVybD5maWxlOi8vJHtiYXNlZGlyfS9zdGFnZTwvdXJsPgorICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+CisgICAgICAgICAgPHJlbGVhc2VzPgorICAgICAgICAgICAgPGVuYWJsZWQ+dHJ1ZTwvZW5hYmxlZD4KKyAgICAgICAgICAgIDxjaGVja3N1bVBvbGljeT5pZ25vcmU8L2NoZWNrc3VtUG9saWN5PgorICAgICAgICAgIDwvcmVsZWFzZXM+CisgICAgICAgICAgPHNuYXBzaG90cz4KKyAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+CisgICAgICAgICAgICA8Y2hlY2tzdW1Qb2xpY3k+aWdub3JlPC9jaGVja3N1bVBvbGljeT4KKyAgICAgICAgICA8L3NuYXBzaG90cz4KKyAgICAgICAgPC9yZXBvc2l0b3J5PgorICAgICAgPC9yZXBvc2l0b3JpZXM+CisgICAgPC9wcm9maWxlPgorICAgIDwhLS0gbG9jYWwgcHJvZmlsZTogdXNlZCB0byBpZ25vcmUgcmVtb3RlIHJlcG9zaXRvcmllcyBpbiBhIGxvY2FsIGJ1aWxkIC0tPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmxvY2FsPC9pZD4KKyAgICAgIDxyZXBvc2l0b3JpZXM+CisgICAgICAgIDxyZXBvc2l0b3J5PgorICAgICAgICAgIDxpZD5jZW50cmFsPC9pZD4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvMS5tYXZlbi5vcmcvbWF2ZW4yPC91cmw+CisgICAgICAgICAgPHJlbGVhc2VzPgorICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+CisgICAgICAgICAgPC9yZWxlYXNlcz4KKyAgICAgICAgICA8c25hcHNob3RzPgorICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+CisgICAgICAgICAgPC9zbmFwc2hvdHM+CisgICAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICAgICAgPHJlcG9zaXRvcnk+CisgICAgICAgICAgPGlkPmFwYWNoZS5yZWxlYXNlczwvaWQ+CisgICAgICAgICAgPG5hbWU+QXBhY2hlIE1haW4gTTIgUmVwb3NpdG9yeTwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLWliaWJsaW8tcnN5bmMtcmVwb3NpdG9yeTwvdXJsPgorICAgICAgICAgIDxyZWxlYXNlcz4KKyAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgorICAgICAgICAgIDwvcmVsZWFzZXM+CisgICAgICAgICAgPHNuYXBzaG90cz4KKyAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgorICAgICAgICAgIDwvc25hcHNob3RzPgorICAgICAgICA8L3JlcG9zaXRvcnk+CisgICAgICAgIDxyZXBvc2l0b3J5PgorICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KKyAgICAgICAgICA8bmFtZT5BcGFjaGUgU25hcHNob3QgUmVwb3NpdG9yeTwvbmFtZT4KKyAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KKyAgICAgICAgICA8cmVsZWFzZXM+CisgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KKyAgICAgICAgICA8L3JlbGVhc2VzPgorICAgICAgICAgIDxzbmFwc2hvdHM+CisgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KKyAgICAgICAgICA8L3NuYXBzaG90cz4KKyAgICAgICAgPC9yZXBvc2l0b3J5PgorICAgICAgPC9yZXBvc2l0b3JpZXM+CisgICAgPC9wcm9maWxlPgorICAgIDwhLS0gU1RBUlQgU05JUFBFVDogcmVsZWFzZS1wcm9maWxlIC0tPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8IS0tIFdlIHdhbnQgdG8gc2lnbiB0aGUgYXJ0aWZhY3QsIHRoZSBQT00sIGFuZCBhbGwgYXR0YWNoZWQgYXJ0aWZhY3RzIC0tPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTM8L3ZlcnNpb24+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHBhc3NwaHJhc2U+JHtncGcucGFzc3BocmFzZX08L3Bhc3NwaHJhc2U+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgorICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPnNpZ248L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgPCEtLSBXZSB3YW50IHRvIGRlcGxveSB0aGUgYXJ0aWZhY3QgdG8gYSBzdGFnaW5nIGxvY2F0aW9uIGZvciBwZXJ1c2FsIC0tPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGFsdERlcGxveW1lbnRSZXBvc2l0b3J5PiR7ZGVwbG95LmFsdFJlcG9zaXRvcnl9PC9hbHREZXBsb3ltZW50UmVwb3NpdG9yeT4KKyAgICAgICAgICAgICAgPHVwZGF0ZVJlbGVhc2VJbmZvPnRydWU8L3VwZGF0ZVJlbGVhc2VJbmZvPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zb3VyY2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CisgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgIDwvYnVpbGQ+CisgICAgPC9wcm9maWxlPgorICAgIDwhLS0gRU5EIFNOSVBQRVQ6IHJlbGVhc2UtcHJvZmlsZSAtLT4KKyAgPC9wcm9maWxlcz4gIAorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy9wb21zL2phbWVzLXByb2plY3QtMS4yLnBvbSBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMvcG9tcy9qYW1lcy1wcm9qZWN0LTEuMi5wb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIyZTQxZAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMvcG9tcy9qYW1lcy1wcm9qZWN0LTEuMi5wb20KQEAgLTAsMCArMSw3NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICA8IS0tCisgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgICAgdW5kZXIgdGhlIExpY2Vuc2UuICAgIAorICAtLT4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmphbWVzPC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5qYW1lcy1wcm9qZWN0PC9hcnRpZmFjdElkPgorICA8bmFtZT5BcGFjaGUgSkFNRVMgUHJvamVjdDwvbmFtZT4KKyAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgorICA8ZGVzY3JpcHRpb24+CisgICAgVGhlIEFwYWNoZSBKQU1FUyBQcm9qZWN0CisgIDwvZGVzY3JpcHRpb24+CisgIAorICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+amFtZXMtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKyAgPG1vZHVsZXM+CisgICAgPG1vZHVsZT5zZXJ2ZXI8L21vZHVsZT4KKyAgPC9tb2R1bGVzPgorICAKKyAgPHVybD5odHRwOi8vamFtZXMuYXBhY2hlLm9yZy88L3VybD4KKyAgPGluY2VwdGlvblllYXI+MjAwNjwvaW5jZXB0aW9uWWVhcj4KKyAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICA8ZGVwZW5kZW5jaWVzPgorICA8L2RlcGVuZGVuY2llcz4KKworICA8aXNzdWVNYW5hZ2VtZW50PgorICAgIDxzeXN0ZW0+SklSQTwvc3lzdGVtPgorICAgIDx1cmw+aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0pBTUVTPC91cmw+CisgIDwvaXNzdWVNYW5hZ2VtZW50PgorCisgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICAgIDwhLS0gRWFjaCBwcm9qZWN0IG11c3Qgb3ZlcnJpZGUgdGhpcyB3aXRoIHRoZWlyIG93biAtLT4KKyAgICA8c2l0ZT4KKyAgICAgIDxpZD5qYW1lcy13ZWJzaXRlPC9pZD4KKyAgICAgIDx1cmw+c2NwOi8vbWlub3RhdXIuYXBhY2hlLm9yZy93d3cvamFtZXMuYXBhY2hlLm9yZy88L3VybD4KKyAgICA8L3NpdGU+CisgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKworICA8bWFpbGluZ0xpc3RzPgorICAgIDxtYWlsaW5nTGlzdD4KKyAgICAgIDxuYW1lPkFwYWNoZSBKYW1lcyBXZWJzaXRlIERldmVsb3BlbWVudDwvbmFtZT4KKyAgICAgIDxzdWJzY3JpYmU+c2l0ZS1kZXYtc3Vic2NyaWJlQGphbWVzLmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KKyAgICAgIDx1bnN1YnNjcmliZT5zaXRlLWRldi11bnN1YnNjcmliZUBqYW1lcy5hcGFjaGUub3JnPC91bnN1YnNjcmliZT4KKyAgICAgIDxwb3N0PnNpdGUtZGV2QGphbWVzLmFwYWNoZS5vcmc8L3Bvc3Q+CisgICAgICA8YXJjaGl2ZT5odHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2phbWVzLXNpdGUtZGV2LzwvYXJjaGl2ZT4KKyAgICA8L21haWxpbmdMaXN0PgorICA8L21haWxpbmdMaXN0cz4KKyAgCisKKyAgPHNjbT4KKyAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvamFtZXMvcHJvamVjdC90YWdzL2phbWVzLXByb2plY3QtMS4yPC9jb25uZWN0aW9uPgorICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvamFtZXMvcHJvamVjdC90YWdzL2phbWVzLXByb2plY3QtMS4yPC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9qYW1lcy9wcm9qZWN0L3RhZ3MvamFtZXMtcHJvamVjdC0xLjI8L3VybD4KKyAgPC9zY20+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy9wb21zL21hdmVuLXNraW4tMS4xLnBvbSBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMvcG9tcy9tYXZlbi1za2luLTEuMS5wb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmMTllMAotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMvcG9tcy9tYXZlbi1za2luLTEuMS5wb20KQEAgLTAsMCArMSw2NiBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgIHVuZGVyIHRoZSBMaWNlbnNlLiAgICAKKy0tPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPm1hdmVuLXNraW48L2FydGlmYWN0SWQ+CisgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgPG5hbWU+SkFNRVMgU2tpbjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPkFwYWNoZSBKQU1FUyBPZmZpY2lhbCBNYXZlbjIgU2l0ZSBTa2luPC9kZXNjcmlwdGlvbj4KKworICA8cGFyZW50PgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+amFtZXMtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisKKworICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKyAgICA8c2l0ZT4KKyAgICAgIDxpZD5tYXZlbi1za2luLXdlYnNpdGU8L2lkPgorICAgICAgPHVybD5zY3A6Ly9taW5vdGF1ci5hcGFjaGUub3JnL3d3dy9qYW1lcy5hcGFjaGUub3JnL21hdmVuLXNraW48L3VybD4KKyAgICA8L3NpdGU+CisgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKworICA8IS0tIFRoaXMgaXMgaGVyZSBiZWNhdXNlIG9mIGh0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvTVJSRVNPVVJDRVMtNiAtLT4KKyAgPHByb3BlcnRpZXM+CisgICAgPG1hdmVuLnRlc3Quc2tpcD50cnVlPC9tYXZlbi50ZXN0LnNraXA+CisgIDwvcHJvcGVydGllcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZW1vdGUtcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KKyAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZTphcGFjaGUtamFyLXJlc291cmNlLWJ1bmRsZToxLjI8L3Jlc291cmNlQnVuZGxlPgorICAgICAgICAgICAgICA8L3Jlc291cmNlQnVuZGxlcz4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy94bWxzL2phbWVzLXBhcmVudC0xLjEtc2l0ZS54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9vcmcuYXBhY2hlLmphbWVzL3htbHMvamFtZXMtcGFyZW50LTEuMS1zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTYwMWFmCi0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy94bWxzL2phbWVzLXBhcmVudC0xLjEtc2l0ZS54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pjxwcm9qZWN0IG5hbWU9IkphbWVzIFBhcmVudCBQT00iPgorICA8YmFubmVyTGVmdD4KKyAgICA8bmFtZT5KYW1lcyBQcm9qZWN0PC9uYW1lPgorICAgIDxzcmM+aW1hZ2VzL2phbWVzLXByb2plY3QtbG9nby5naWY8L3NyYz4KKyAgICA8aHJlZj5odHRwOi8vamFtZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sPC9ocmVmPgorICA8L2Jhbm5lckxlZnQ+CisgIDxiYW5uZXJSaWdodD4KKyAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L25hbWU+CisgICAgPHNyYz5pbWFnZXMvYXNmLWxvZ28tcmVkdWNlZC5naWY8L3NyYz4KKyAgICA8aHJlZj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KKyAgPC9iYW5uZXJSaWdodD4KKyAgPHNraW4+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5za2luczwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZWZhdWx0LXNraW48L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICA8L3NraW4+CisgIDxib2R5IC8+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy94bWxzL2phbWVzLXBhcmVudC0xLjEtc2l0ZV9lbi54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9vcmcuYXBhY2hlLmphbWVzL3htbHMvamFtZXMtcGFyZW50LTEuMS1zaXRlX2VuLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy94bWxzL2phbWVzLXBhcmVudC0xLjEtc2l0ZV9lbi54bWwKZGlmZiAtLWdpdCBhL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMveG1scy9qYW1lcy1wcm9qZWN0LTEuMi1zaXRlLnhtbCBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMveG1scy9qYW1lcy1wcm9qZWN0LTEuMi1zaXRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk0OTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS5qYW1lcy94bWxzL2phbWVzLXByb2plY3QtMS4yLXNpdGUueG1sCkBAIC0wLDAgKzEsNjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz48cHJvamVjdCBuYW1lPSJKYW1lcyBQcm9qZWN0Ij4KKyAgPGJhbm5lckxlZnQ+CisgICAgPG5hbWU+SmFtZXMgUHJvamVjdDwvbmFtZT4KKyAgICA8c3JjPmltYWdlcy9qYW1lcy1wcm9qZWN0LWxvZ28uZ2lmPC9zcmM+CisgICAgPGhyZWY+aHR0cDovL2phbWVzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KKyAgPC9iYW5uZXJMZWZ0PgorICA8YmFubmVyUmlnaHQ+CisgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgorICAgIDxzcmM+aW1hZ2VzL2FzZi1sb2dvLXJlZHVjZWQuZ2lmPC9zcmM+CisgICAgPGhyZWY+aHR0cDovL3d3dy5hcGFjaGUub3JnL2luZGV4Lmh0bWw8L2hyZWY+CisgIDwvYmFubmVyUmlnaHQ+CisgIDxza2luPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuamFtZXM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2tpbjwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+CisgIDwvc2tpbj4KKyAgPGJvZHk+CisgICAgPGxpbmtzPgorICAgICAgPGl0ZW0gbmFtZT0iSkFNRVMgUHJvamVjdCIgaHJlZj0iL2luZGV4Lmh0bWwiIC8+CisgICAgICA8aXRlbSBuYW1lPSJTZXJ2ZXIiIGhyZWY9Ii9zZXJ2ZXIvaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9Ik1haWxldCBBUEkiIGhyZWY9Ii9tYWlsZXQvaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9ImpTUEYiIGhyZWY9Ii9qc3BmL2luZGV4Lmh0bWwiIC8+CisgICAgICA8aXRlbSBuYW1lPSJNaW1lNEoiIGhyZWY9Ii9taW1lNGovaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9IkpTaWV2ZSIgaHJlZj0iL2pzaWV2ZS9pbmRleC5odG1sIiAvPgorICAgICAgPGl0ZW0gbmFtZT0iUG9zdGFnZSIgaHJlZj0iL3Bvc3RhZ2UvaW5kZXguaHRtbCIgLz4KKyAgICA8L2xpbmtzPgorICAgIDxtZW51IG5hbWU9IlN1YiBQcm9qZWN0cyI+CisgICAgICA8aXRlbSBuYW1lPSJTZXJ2ZXIiIGhyZWY9Ii9zZXJ2ZXIvaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9Ik1haWxldCBBUEkiIGhyZWY9Ii9tYWlsZXQvaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9ImpTUEYiIGhyZWY9Ii9qc3BmL2luZGV4Lmh0bWwiIC8+CisgICAgICA8aXRlbSBuYW1lPSJNaW1lNEoiIGhyZWY9Ii9taW1lNGovaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9IkpTaWV2ZSIgaHJlZj0iL2pzaWV2ZS9pbmRleC5odG1sIiAvPgorICAgICAgPGl0ZW0gbmFtZT0iUG9zdGFnZSIgaHJlZj0iL3Bvc3RhZ2UvaW5kZXguaHRtbCIgLz4KKyAgICA8L21lbnU+CisgICAgPG1lbnUgbmFtZT0iQWJvdXQiPgorICAgICAgPGl0ZW0gbmFtZT0iTmV3cyIgaHJlZj0iL25ld3NhcmNoaXZlLmh0bWwiIC8+CisgICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgaHJlZj0iL2luZGV4Lmh0bWwiIC8+CisgICAgICA8aXRlbSBuYW1lPSJNYWlsaW5nIExpc3RzIiBocmVmPSIvbWFpbC5odG1sIiAvPgorICAgICAgPGl0ZW0gbmFtZT0iUHJvamVjdCBHdWlkZWxpbmVzIiBocmVmPSIvZ3VpZGVsaW5lcy5odG1sIiAvPgorICAgICAgPGl0ZW0gbmFtZT0iV2lraSIgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9qYW1lcyIgLz4KKyAgICAgIDxpdGVtIG5hbWU9IldobyBXZSBBcmUiIGhyZWY9Ii93ZWFyZS5odG1sIiAvPgorICAgICAgPGl0ZW0gbmFtZT0iQ29udHJpYnV0aW5nIiBocmVmPSIvY29udHJpYnV0ZS5odG1sIiAvPgorICAgICAgPGl0ZW0gbmFtZT0iU3RhbmRhcmRzIiBocmVmPSIvY29kZS1zdGFuZGFyZHMuaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9IkxpY2Vuc2UiIGhyZWY9Ii9saWNlbnNlLmh0bWwiIC8+CisgICAgPC9tZW51PgorICAgIDxtZW51IG5hbWU9IkRvd25sb2FkcyIgaW5oZXJpdD0iYm90dG9tIj4KKyAgICAgIDxpdGVtIG5hbWU9IlN0YWJsZSByZWxlYXNlcyIgaHJlZj0iL2Rvd25sb2FkLmNnaSIgLz4KKyAgICAgIDxpdGVtIG5hbWU9IlVuc3RhYmxlIHJlbGVhc2VzIiBocmVmPSIvZG93bmxvYWR1bnN0YWJsZS5jZ2kiIC8+CisgICAgICA8aXRlbSBuYW1lPSJOaWdodGx5IGJ1aWxkcyIgaHJlZj0iaHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL2J1aWxkcy9qYW1lcy9uaWdodGx5LyIgLz4KKyAgICA8L21lbnU+CisgICAgPG1lbnUgbmFtZT0iVHJhbnNsYXRlZCI+CisgICAgICA8aXRlbSBuYW1lPSJKYXBhbmVzZSAod2ViKSIgaHJlZj0iaHR0cDovL2phbWVzLnRlcnJhLWludGwuY29tLyIgLz4KKyAgICA8L21lbnU+CisgICAgPG1lbnUgbmFtZT0iUmVsYXRlZCBQcm9qZWN0cyI+CisgICAgICA8aXRlbSBuYW1lPSJKYWthcnRhIENvbW1vbnMiIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9pbmRleC5odG1sIiAvPgorICAgICAgPGl0ZW0gbmFtZT0iQW50IiBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9Ik1hdmVuMiIgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9IkRlcmJ5IiBocmVmPSJodHRwOi8vZGIuYXBhY2hlLm9yZy9kZXJieS9pbmRleC5odG1sIiAvPgorICAgICAgPGl0ZW0gbmFtZT0iQXZhbG9uIiBocmVmPSJodHRwOi8vYXZhbG9uLmFwYWNoZS5vcmcvaW5kZXguaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9IkROU0phdmEiIGhyZWY9Imh0dHA6Ly93d3cuZG5zamF2YS5vcmcvaW5kZXguaHRtbCIgLz4KKyAgICA8L21lbnU+CisgICAgPG1lbnUgbmFtZT0iVXNlZnVsIEluZm9ybWF0aW9uIj4KKyAgICAgIDxpdGVtIG5hbWU9IkdldCBJbnZvbHZlZCIgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL2dldGludm9sdmVkLmh0bWwiIC8+CisgICAgICA8aXRlbSBuYW1lPSJSZWZlcmVuY2UgTGlicmFyeSIgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9zaXRlL2xpYnJhcnkuaHRtbCIgLz4KKyAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL2FwYWNoZS5vcmcvZm91bmRhdGlvbi9mYXEuaHRtbCIgLz4KKyAgICA8L21lbnU+CisgIDwvYm9keT4KKzwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9vcmcuYXBhY2hlLmphbWVzL3htbHMvamFtZXMtcHJvamVjdC0xLjItc2l0ZV9lbi54bWwgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9vcmcuYXBhY2hlLmphbWVzL3htbHMvamFtZXMtcHJvamVjdC0xLjItc2l0ZV9lbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2FwYWNoZS1taW1lNGotMC42L3N0YWdlL29yZy5hcGFjaGUuamFtZXMveG1scy9qYW1lcy1wcm9qZWN0LTEuMi1zaXRlX2VuLnhtbApkaWZmIC0tZ2l0IGEvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS9qYXJzL2FwYWNoZS1qYXItcmVzb3VyY2UtYnVuZGxlLTEuMi5qYXIgYi9hcGFjaGUtbWltZTRqLTAuNi9zdGFnZS9vcmcuYXBhY2hlL2phcnMvYXBhY2hlLWphci1yZXNvdXJjZS1idW5kbGUtMS4yLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDJjMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBhY2hlLW1pbWU0ai0wLjYvc3RhZ2Uvb3JnLmFwYWNoZS9qYXJzL2FwYWNoZS1qYXItcmVzb3VyY2UtYnVuZGxlLTEuMi5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgo=